diff options
author | Mike Frysinger <vapier@gentoo.org> | 2004-08-03 04:44:55 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2004-08-03 04:44:55 +0000 |
commit | 1da1d197b805890b2cc06c11227d251274d8d81d (patch) | |
tree | 5bae6285139079cc4471ea0ded2f4a98623543ff /sys-devel/gdb | |
parent | add sandbox to the default FEATURES (diff) | |
download | gentoo-2-1da1d197b805890b2cc06c11227d251274d8d81d.tar.gz gentoo-2-1da1d197b805890b2cc06c11227d251274d8d81d.tar.bz2 gentoo-2-1da1d197b805890b2cc06c11227d251274d8d81d.zip |
move more of the hppa patches to gentoo mirrors
Diffstat (limited to 'sys-devel/gdb')
-rw-r--r-- | sys-devel/gdb/files/digest-gdb-5.3 | 1 | ||||
-rw-r--r-- | sys-devel/gdb/files/digest-gdb-5.3-r1 | 1 | ||||
-rw-r--r-- | sys-devel/gdb/files/digest-gdb-6.1 | 1 | ||||
-rw-r--r-- | sys-devel/gdb/files/digest-gdb-6.1.1 | 1 | ||||
-rw-r--r-- | sys-devel/gdb/files/gdb-6.1-hppa-01.patch | 5821 | ||||
-rw-r--r-- | sys-devel/gdb/gdb-6.1.1.ebuild | 8 | ||||
-rw-r--r-- | sys-devel/gdb/gdb-6.1.ebuild | 7 |
7 files changed, 12 insertions, 5828 deletions
diff --git a/sys-devel/gdb/files/digest-gdb-5.3 b/sys-devel/gdb/files/digest-gdb-5.3 index f8d7f49c55f2..55d409b7b69a 100644 --- a/sys-devel/gdb/files/digest-gdb-5.3 +++ b/sys-devel/gdb/files/digest-gdb-5.3 @@ -1,2 +1,3 @@ MD5 70e4ade69a2dff2c7b9af9a4ef44798f gdb-5.3.tar.bz2 11198721 +MD5 710adff7bd004b363f4091b7953548cc gdb-5.3-hppa-patches.tar.bz2 39910 MD5 5ecd492d63fc129ae533e5c308c8af09 gdb-5_3-objc-patch.tgz 61236 diff --git a/sys-devel/gdb/files/digest-gdb-5.3-r1 b/sys-devel/gdb/files/digest-gdb-5.3-r1 index 9d4e2b030486..9e1739f0226e 100644 --- a/sys-devel/gdb/files/digest-gdb-5.3-r1 +++ b/sys-devel/gdb/files/digest-gdb-5.3-r1 @@ -1,3 +1,4 @@ MD5 70e4ade69a2dff2c7b9af9a4ef44798f gdb-5.3.tar.bz2 11198721 +MD5 710adff7bd004b363f4091b7953548cc gdb-5.3-hppa-patches.tar.bz2 39910 MD5 5ecd492d63fc129ae533e5c308c8af09 gdb-5_3-objc-patch.tgz 61236 MD5 8a69379518ee53df892886c60445838c gdb-5.3-s390-june2003.tar.gz 26145 diff --git a/sys-devel/gdb/files/digest-gdb-6.1 b/sys-devel/gdb/files/digest-gdb-6.1 index ab1d69e9e9cc..657495a4bdb4 100644 --- a/sys-devel/gdb/files/digest-gdb-6.1 +++ b/sys-devel/gdb/files/digest-gdb-6.1 @@ -1 +1,2 @@ MD5 4ba97f5efba4190f2e214e32c72c3fa0 gdb-6.1.tar.bz2 12571495 +MD5 3e0f43b95685125b20fc866c88d1d122 gdb-6.1-hppa-01.patch.bz2 41093 diff --git a/sys-devel/gdb/files/digest-gdb-6.1.1 b/sys-devel/gdb/files/digest-gdb-6.1.1 index 327ee61caf2b..ab90b23d6948 100644 --- a/sys-devel/gdb/files/digest-gdb-6.1.1 +++ b/sys-devel/gdb/files/digest-gdb-6.1.1 @@ -1 +1,2 @@ MD5 dd25473f61a3a2e1b08dee5f67ebae28 gdb-6.1.1.tar.bz2 12586670 +MD5 3e0f43b95685125b20fc866c88d1d122 gdb-6.1-hppa-01.patch.bz2 41093 diff --git a/sys-devel/gdb/files/gdb-6.1-hppa-01.patch b/sys-devel/gdb/files/gdb-6.1-hppa-01.patch deleted file mode 100644 index 84fae8cf54d5..000000000000 --- a/sys-devel/gdb/files/gdb-6.1-hppa-01.patch +++ /dev/null @@ -1,5821 +0,0 @@ -diff -uNr gdb-6.1.orig/gdb/config/djgpp/fnchange.lst gdb-6.1/gdb/config/djgpp/fnchange.lst ---- gdb-6.1.orig/gdb/config/djgpp/fnchange.lst 2004-06-06 20:16:24.469809664 +0000 -+++ gdb-6.1/gdb/config/djgpp/fnchange.lst 2004-06-06 20:16:53.664371416 +0000 -@@ -232,6 +232,8 @@ - @V@/gdb/testsuite/gdb.mi/mi2-var-display.exp @V@/gdb/testsuite/gdb.mi/mi2vardisplay.exp - @V@/gdb/amd64-linux-tdep.c @V@/gdb/amd64-ltdep.c - @V@/gdb/amd64-linux-nat.c @V@/gdb/amd64-lnat.c -+@V@/gdb/hppa-linux-tdep.c @V@/gdb/palnxtdep.c -+@V@/gdb/hppa-linux-nat.c @V@/gdb/palnxnat.c - @V@/include/ChangeLog-9103 @V@/include/ChangeLog.9103 - @V@/include/coff/ChangeLog-9103 @V@/include/coff/ChangeLog.9103 - @V@/include/elf/ChangeLog-9103 @V@/include/elf/ChangeLog.9103 -diff -uNr gdb-6.1.orig/gdb/config/pa/linux.mh gdb-6.1/gdb/config/pa/linux.mh ---- gdb-6.1.orig/gdb/config/pa/linux.mh 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/config/pa/linux.mh 2004-06-06 20:16:53.667370960 +0000 -@@ -0,0 +1,9 @@ -+# Host: Hewlett-Packard PA-RISC machine, running Linux -+XDEPFILES= -+XM_FILE= xm-linux.h -+NAT_FILE= nm-linux.h -+NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o gcore.o \ -+ core-regset.o hppa-linux-nat.o linux-proc.o \ -+ proc-service.o thread-db.o lin-lwp.o linux-nat.o -+ -+XM_CLIBS= -ldl -rdynamic -diff -uNr gdb-6.1.orig/gdb/config/pa/linux.mt gdb-6.1/gdb/config/pa/linux.mt ---- gdb-6.1.orig/gdb/config/pa/linux.mt 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/config/pa/linux.mt 2004-06-06 20:16:53.669370656 +0000 -@@ -0,0 +1,3 @@ -+# Target: HP PA-RISC running Linux -+TDEPFILES= hppa-tdep.o hppa-linux-tdep.o glibc-tdep.o solib.o solib-svr4.o -+TM_FILE=tm-hppa.h -diff -uNr gdb-6.1.orig/gdb/config/pa/nm-linux.h gdb-6.1/gdb/config/pa/nm-linux.h ---- gdb-6.1.orig/gdb/config/pa/nm-linux.h 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/config/pa/nm-linux.h 2004-06-06 20:16:53.671370352 +0000 -@@ -0,0 +1,56 @@ -+/* Native support for GNU/Linux, for GDB, the GNU debugger. -+ Copyright (C) 2004 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, -+ Boston, MA 02111-1307, USA. */ -+ -+#ifndef PA_NM_LINUX_H -+#define PA_NM_LINUX_H -+ -+#include "config/nm-linux.h" -+ -+#define U_REGS_OFFSET 0 -+ -+#define CANNOT_FETCH_REGISTER(regno) pa_cannot_fetch_register(regno) -+extern int pa_cannot_fetch_register (int regno); -+ -+#define CANNOT_STORE_REGISTER(regno) pa_cannot_store_register(regno) -+extern int pa_cannot_store_register (int regno); -+ -+#define HAVE_STEPPABLE_WATCHPOINT 1 -+#define STOPPED_BY_WATCHPOINT(W) \ -+ pa_linux_stopped_by_watchpoint (PIDGET(inferior_ptid)) -+extern CORE_ADDR pa_linux_stopped_by_watchpoint (int); -+ -+#define target_insert_watchpoint(addr, len, type) \ -+ pa_linux_insert_watchpoint (PIDGET(inferior_ptid), addr, len, type) -+extern int pa_linux_insert_watchpoint (int pid, CORE_ADDR addr, -+ int len, int rw); -+ -+#define target_remove_watchpoint(addr, len, type) \ -+ pa_linux_remove_watchpoint (PIDGET(inferior_ptid), addr, len) -+extern int pa_linux_remove_watchpoint (int pid, CORE_ADDR addr, int len); -+ -+/* Hardware watchpoints */ -+ -+#define TARGET_HAS_HARDWARE_WATCHPOINTS -+ -+#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) \ -+ (type == bp_hardware_watchpoint) -+ -+#endif -+ -diff -uNr gdb-6.1.orig/gdb/config/pa/tm-hppa.h gdb-6.1/gdb/config/pa/tm-hppa.h ---- gdb-6.1.orig/gdb/config/pa/tm-hppa.h 2004-06-06 20:16:24.652781848 +0000 -+++ gdb-6.1/gdb/config/pa/tm-hppa.h 2004-06-06 20:16:53.676369592 +0000 -@@ -26,9 +26,6 @@ - - #include "regcache.h" - --/* Wonder if this is correct? Should be using push_dummy_call(). */ --#define DEPRECATED_DUMMY_WRITE_SP(SP) deprecated_write_sp (SP) -- - #define GDB_MULTI_ARCH 1 - - /* Hack, get around problem with including "arch-utils.h". */ -@@ -62,6 +59,8 @@ - other r registers. */ - #define FLAGS_REGNUM 0 /* Various status flags */ - #define RP_REGNUM 2 /* return pointer */ -+#define HPPA_FP_REGNUM 3 /* The ABI's frame pointer, when used */ -+#define HPPA_SP_REGNUM 30 /* Stack pointer. */ - #define SAR_REGNUM 32 /* Shift Amount Register */ - #define IPSW_REGNUM 41 /* Interrupt Processor Status Word */ - #define PCOQ_HEAD_REGNUM 33 /* instruction offset queue head */ -@@ -76,6 +75,7 @@ - #define CCR_REGNUM 54 /* Coprocessor Configuration Register */ - #define TR0_REGNUM 57 /* Temporary Registers (cr24 -> cr31) */ - #define CR27_REGNUM 60 /* Base register for thread-local storage, cr27 */ -+#define HPPA_FP0_REGNUM 64 /* First floating-point. */ - #define FP4_REGNUM 72 - - #define ARG0_REGNUM 26 /* The first argument of a callee. */ -@@ -93,12 +93,6 @@ - (buf)[sizeof(CORE_ADDR) -1] &= ~0x3; \ - } while (0) - --/* Define DEPRECATED_DO_REGISTERS_INFO() to do machine-specific -- formatting of register dumps. */ -- --#define DEPRECATED_DO_REGISTERS_INFO(_regnum, fp) pa_do_registers_info (_regnum, fp) --extern void pa_do_registers_info (int, int); -- - /* PA specific macro to see if the current instruction is nullified. */ - #ifndef INSTRUCTION_NULLIFIED - extern int hppa_instruction_nullified (void); -@@ -107,104 +101,6 @@ - - #define INSTRUCTION_SIZE 4 - --/* This sequence of words is the instructions -- -- ; Call stack frame has already been built by gdb. Since we could be calling -- ; a varargs function, and we do not have the benefit of a stub to put things in -- ; the right place, we load the first 4 word of arguments into both the general -- ; and fp registers. -- call_dummy -- ldw -36(sp), arg0 -- ldw -40(sp), arg1 -- ldw -44(sp), arg2 -- ldw -48(sp), arg3 -- ldo -36(sp), r1 -- fldws 0(0, r1), fr4 -- fldds -4(0, r1), fr5 -- fldws -8(0, r1), fr6 -- fldds -12(0, r1), fr7 -- ldil 0, r22 ; FUNC_LDIL_OFFSET must point here -- ldo 0(r22), r22 ; FUNC_LDO_OFFSET must point here -- ldsid (0,r22), r4 -- ldil 0, r1 ; SR4EXPORT_LDIL_OFFSET must point here -- ldo 0(r1), r1 ; SR4EXPORT_LDO_OFFSET must point here -- ldsid (0,r1), r20 -- combt,=,n r4, r20, text_space ; If target is in data space, do a -- ble 0(sr5, r22) ; "normal" procedure call -- copy r31, r2 -- break 4, 8 -- mtsp r21, sr0 -- ble,n 0(sr0, r22) -- text_space ; Otherwise, go through _sr4export, -- ble (sr4, r1) ; which will return back here. -- stw r31,-24(r30) -- break 4, 8 -- mtsp r21, sr0 -- ble,n 0(sr0, r22) -- nop ; To avoid kernel bugs -- nop ; and keep the dummy 8 byte aligned -- -- The dummy decides if the target is in text space or data space. If -- it's in data space, there's no problem because the target can -- return back to the dummy. However, if the target is in text space, -- the dummy calls the secret, undocumented routine _sr4export, which -- calls a function in text space and can return to any space. Instead -- of including fake instructions to represent saved registers, we -- know that the frame is associated with the call dummy and treat it -- specially. -- -- The trailing NOPs are needed to avoid a bug in HPUX, BSD and OSF1 -- kernels. If the memory at the location pointed to by the PC is -- 0xffffffff then a ptrace step call will fail (even if the instruction -- is nullified). -- -- The code to pop a dummy frame single steps three instructions -- starting with the last mtsp. This includes the nullified "instruction" -- following the ble (which is uninitialized junk). If the -- "instruction" following the last BLE is 0xffffffff, then the ptrace -- will fail and the dummy frame is not correctly popped. -- -- By placing a NOP in the delay slot of the BLE instruction we can be -- sure that we never try to execute a 0xffffffff instruction and -- avoid the kernel bug. The second NOP is needed to keep the call -- dummy 8 byte aligned. */ -- --#define CALL_DUMMY {0x4BDA3FB9, 0x4BD93FB1, 0x4BD83FA9, 0x4BD73FA1,\ -- 0x37C13FB9, 0x24201004, 0x2C391005, 0x24311006,\ -- 0x2C291007, 0x22C00000, 0x36D60000, 0x02C010A4,\ -- 0x20200000, 0x34210000, 0x002010b4, 0x82842022,\ -- 0xe6c06000, 0x081f0242, 0x00010004, 0x00151820,\ -- 0xe6c00002, 0xe4202000, 0x6bdf3fd1, 0x00010004,\ -- 0x00151820, 0xe6c00002, 0x08000240, 0x08000240} -- --#define REG_PARM_STACK_SPACE 16 -- --/* If we've reached a trap instruction within the call dummy, then -- we'll consider that to mean that we've reached the call dummy's -- end after its successful completion. */ --#define DEPRECATED_CALL_DUMMY_HAS_COMPLETED(pc, sp, frame_address) \ -- (DEPRECATED_PC_IN_CALL_DUMMY((pc), (sp), (frame_address)) && \ -- (read_memory_integer((pc), 4) == BREAKPOINT32)) -- --/* Insert the specified number of args and function address into a -- call sequence of the above form stored at DUMMYNAME. -- -- On the hppa we need to call the stack dummy through $$dyncall. -- Therefore our version of DEPRECATED_FIX_CALL_DUMMY takes an extra -- argument, real_pc, which is the location where gdb should start up -- the inferior to do the function call. */ -- --/* FIXME: brobecker 2002-12-26. This macro is going to cause us some -- problems before we can go to multiarch partial as it has been -- diverted on HPUX to return the value of the PC! */ --/* NOTE: cagney/2003-05-03: This has been replaced by push_dummy_code. -- Hopefully that has all the parameters HP/UX needs. */ --#define DEPRECATED_FIX_CALL_DUMMY hppa_fix_call_dummy --extern CORE_ADDR hppa_fix_call_dummy (char *, CORE_ADDR, CORE_ADDR, int, -- struct value **, struct type *, int); -- --#define GDB_TARGET_IS_HPPA -- - /* - * Unwind table and descriptor. - */ -diff -uNr gdb-6.1.orig/gdb/config/pa/tm-hppa64.h gdb-6.1/gdb/config/pa/tm-hppa64.h ---- gdb-6.1.orig/gdb/config/pa/tm-hppa64.h 2004-06-06 20:16:24.653781696 +0000 -+++ gdb-6.1/gdb/config/pa/tm-hppa64.h 2004-06-06 20:16:53.679369136 +0000 -@@ -57,81 +57,9 @@ - - /* jimb: omitted dynamic linking stuff here */ - --/* This sequence of words is the instructions -- --; Call stack frame has already been built by gdb. Since we could be calling --; a varargs function, and we do not have the benefit of a stub to put things in --; the right place, we load the first 8 word of arguments into both the general --; and fp registers. --call_dummy -- nop -- copy %r4,%r29 -- copy %r5,%r22 -- copy %r6,%r27 -- fldd -64(0,%r29),%fr4 -- fldd -56(0,%r29),%fr5 -- fldd -48(0,%r29),%fr6 -- fldd -40(0,%r29),%fr7 -- fldd -32(0,%r29),%fr8 -- fldd -24(0,%r29),%fr9 -- fldd -16(0,%r29),%fr10 -- fldd -8(0,%r29),%fr11 -- copy %r22,%r1 -- ldd -64(%r29), %r26 -- ldd -56(%r29), %r25 -- ldd -48(%r29), %r24 -- ldd -40(%r29), %r23 -- ldd -32(%r29), %r22 -- ldd -24(%r29), %r21 -- ldd -16(%r29), %r20 -- bve,l (%r1),%r2 -- ldd -8(%r29), %r19 -- break 4, 8 -- mtsp %r21, %sr0 -- ble 0(%sr0, %r22) -- nop --*/ -- --/* Call dummys are sized and written out in word sized hunks. So we have -- to pack the instructions into words. Ugh. */ --#undef CALL_DUMMY --#define CALL_DUMMY {0x08000240349d0000LL, 0x34b6000034db0000LL, \ -- 0x53a43f8353a53f93LL, 0x53a63fa353a73fb3LL,\ -- 0x53a83fc353a93fd3LL, 0x2fa1100a2fb1100bLL,\ -- 0x36c1000053ba3f81LL, 0x53b93f9153b83fa1LL,\ -- 0x53b73fb153b63fc1LL, 0x53b53fd10fa110d4LL,\ -- 0xe820f0000fb110d3LL, 0x0001000400151820LL,\ -- 0xe6c0000008000240LL} -- --/* The PA64 ABI reserves 64 bytes of stack space for outgoing register -- parameters. */ --#undef REG_PARM_STACK_SPACE --#define REG_PARM_STACK_SPACE 64 -- --/* Use the 64-bit calling conventions designed for the PA2.0 in wide mode. */ --#define PA20W_CALLING_CONVENTIONS -- - #undef FUNC_LDIL_OFFSET - #undef FUNC_LDO_OFFSET - #undef SR4EXPORT_LDIL_OFFSET - #undef SR4EXPORT_LDO_OFFSET - --#undef FRAME_SAVED_PC_IN_SIGTRAMP --extern void hppa64_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi, -- CORE_ADDR *tmp); --#define FRAME_SAVED_PC_IN_SIGTRAMP(FRAME, TMP) \ -- hppa64_hpux_frame_saved_pc_in_sigtramp (FRAME, TMP) -- --#undef FRAME_BASE_BEFORE_SIGTRAMP --extern void hppa64_hpux_frame_base_before_sigtramp (struct frame_info *fi, -- CORE_ADDR *tmp); --#define FRAME_BASE_BEFORE_SIGTRAMP(FRAME, TMP) \ -- hppa64_hpux_frame_base_before_sigtramp (FRAME, TMP) -- --#undef FRAME_FIND_SAVED_REGS_IN_SIGTRAMP --extern void hppa64_hpux_frame_find_saved_regs_in_sigtramp -- (struct frame_info *fi, CORE_ADDR *fsr); --#define FRAME_FIND_SAVED_REGS_IN_SIGTRAMP(FRAME, FSR) \ -- hppa64_hpux_frame_find_saved_regs_in_sigtramp (FRAME, FSR) -- - /* jimb: omitted purify call support */ -diff -uNr gdb-6.1.orig/gdb/config/pa/tm-hppah.h gdb-6.1/gdb/config/pa/tm-hppah.h ---- gdb-6.1.orig/gdb/config/pa/tm-hppah.h 2004-06-06 20:16:24.654781544 +0000 -+++ gdb-6.1/gdb/config/pa/tm-hppah.h 2004-06-06 20:16:53.682368680 +0000 -@@ -36,21 +36,6 @@ - #include "somsolib.h" - #endif - --extern void hppa32_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi, -- CORE_ADDR *tmp); --#define FRAME_SAVED_PC_IN_SIGTRAMP(FRAME, TMP) \ -- hppa32_hpux_frame_saved_pc_in_sigtramp (FRAME, TMP) -- --extern void hppa32_hpux_frame_base_before_sigtramp (struct frame_info *fi, -- CORE_ADDR *tmp); --#define FRAME_BASE_BEFORE_SIGTRAMP(FRAME, TMP) \ -- hppa32_hpux_frame_base_before_sigtramp (FRAME, TMP) -- --extern void hppa32_hpux_frame_find_saved_regs_in_sigtramp -- (struct frame_info *fi, CORE_ADDR *fsr); --#define FRAME_FIND_SAVED_REGS_IN_SIGTRAMP(FRAME, FSR) \ -- hppa32_hpux_frame_find_saved_regs_in_sigtramp (FRAME, FSR) -- - /* For HP-UX on PA-RISC we have an implementation - for the exception handling target op (in hppa-tdep.c) */ - #define CHILD_ENABLE_EXCEPTION_CALLBACK -diff -uNr gdb-6.1.orig/gdb/config/pa/xm-linux.h gdb-6.1/gdb/config/pa/xm-linux.h ---- gdb-6.1.orig/gdb/config/pa/xm-linux.h 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/config/pa/xm-linux.h 2004-06-06 20:16:53.685368224 +0000 -@@ -0,0 +1,31 @@ -+/* Host-dependent definitions for the hppa-linux. -+ -+ Copyright 2004 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, -+ Boston, MA 02111-1307, USA. */ -+ -+#ifndef XM_HPPA_LINUX_H -+#define XM_HPPA_LINUX_H -+ -+#include "floatformat.h" -+ -+#define HOST_FLOAT_FORMAT &floatformat_ieee_single_big -+#define HOST_DOUBLE_FORMAT &floatformat_ieee_double_big -+#define HOST_LONG_DOUBLE_FORMAT &floatformat_ieee_double_big -+ -+#endif /* xm-linux.h */ -diff -uNr gdb-6.1.orig/gdb/configure.host gdb-6.1/gdb/configure.host ---- gdb-6.1.orig/gdb/configure.host 2004-06-06 20:16:23.393973216 +0000 -+++ gdb-6.1/gdb/configure.host 2004-06-06 20:16:53.687367920 +0000 -@@ -48,6 +48,7 @@ - hppa*64*-*-hpux11*) gdb_host=hpux11w ;; - hppa*-*-hpux11*) gdb_host=hpux11 ;; - hppa*-*-hpux*) gdb_host=hppahpux ;; -+hppa*-*-linux*) gdb_host=linux ;; - - i[34567]86-ncr-*) gdb_host=ncr3000 ;; - i[34567]86-*-dgux*) gdb_host=i386v4 ;; -diff -uNr gdb-6.1.orig/gdb/configure.tgt gdb-6.1/gdb/configure.tgt ---- gdb-6.1.orig/gdb/configure.tgt 2004-06-06 20:16:23.396972760 +0000 -+++ gdb-6.1/gdb/configure.tgt 2004-06-06 20:16:53.690367464 +0000 -@@ -74,6 +74,7 @@ - hppa*64*-*-hpux11*) gdb_target=hppa64 ;; - hppa*-*-hpux*) gdb_target=hppahpux ;; - hppa*-*-hiux*) gdb_target=hppahpux ;; -+hppa*-*-linux*) gdb_target=linux ;; - hppa*-*-*) gdb_target=hppa ;; - - i[34567]86-ncr-*) gdb_target=ncr3000 ;; -diff -uNr gdb-6.1.orig/gdb/hppa-hpux-tdep.c gdb-6.1/gdb/hppa-hpux-tdep.c ---- gdb-6.1.orig/gdb/hppa-hpux-tdep.c 2004-06-06 20:16:23.571946160 +0000 -+++ gdb-6.1/gdb/hppa-hpux-tdep.c 2004-06-06 20:16:53.700365944 +0000 -@@ -24,11 +24,32 @@ - #include "osabi.h" - #include "gdb_string.h" - #include "frame.h" -+#include "symtab.h" -+#include "objfiles.h" -+#include "inferior.h" -+#include "infcall.h" -+ -+#include <dl.h> -+#include <machine/save_state.h> - - /* Forward declarations. */ - extern void _initialize_hppa_hpux_tdep (void); - extern initialize_file_ftype _initialize_hppa_hpux_tdep; - -+typedef struct -+ { -+ struct minimal_symbol *msym; -+ CORE_ADDR solib_handle; -+ CORE_ADDR return_val; -+ } -+args_for_find_stub; -+ -+/* This is declared in symtab.c; set to 1 in hp-symtab-read.c */ -+extern int hp_som_som_object_present; -+ -+/* In breakpoint.c */ -+extern int exception_catchpoints_are_fragile; -+ - /* FIXME: brobecker 2002-12-25. The following functions will eventually - become static, after the multiarching conversion is done. */ - int hppa_hpux_pc_in_sigtramp (CORE_ADDR pc, char *name); -@@ -148,10 +169,560 @@ - } - } - -+/* Exception handling support for the HP-UX ANSI C++ compiler. -+ The compiler (aCC) provides a callback for exception events; -+ GDB can set a breakpoint on this callback and find out what -+ exception event has occurred. */ -+ -+/* The name of the hook to be set to point to the callback function */ -+static char HP_ACC_EH_notify_hook[] = "__eh_notify_hook"; -+/* The name of the function to be used to set the hook value */ -+static char HP_ACC_EH_set_hook_value[] = "__eh_set_hook_value"; -+/* The name of the callback function in end.o */ -+static char HP_ACC_EH_notify_callback[] = "__d_eh_notify_callback"; -+/* Name of function in end.o on which a break is set (called by above) */ -+static char HP_ACC_EH_break[] = "__d_eh_break"; -+/* Name of flag (in end.o) that enables catching throws */ -+static char HP_ACC_EH_catch_throw[] = "__d_eh_catch_throw"; -+/* Name of flag (in end.o) that enables catching catching */ -+static char HP_ACC_EH_catch_catch[] = "__d_eh_catch_catch"; -+/* The enum used by aCC */ -+typedef enum -+ { -+ __EH_NOTIFY_THROW, -+ __EH_NOTIFY_CATCH -+ } -+__eh_notification; -+ -+/* Is exception-handling support available with this executable? */ -+static int hp_cxx_exception_support = 0; -+/* Has the initialize function been run? */ -+int hp_cxx_exception_support_initialized = 0; -+/* Similar to above, but imported from breakpoint.c -- non-target-specific */ -+extern int exception_support_initialized; -+/* Address of __eh_notify_hook */ -+static CORE_ADDR eh_notify_hook_addr = 0; -+/* Address of __d_eh_notify_callback */ -+static CORE_ADDR eh_notify_callback_addr = 0; -+/* Address of __d_eh_break */ -+static CORE_ADDR eh_break_addr = 0; -+/* Address of __d_eh_catch_catch */ -+static CORE_ADDR eh_catch_catch_addr = 0; -+/* Address of __d_eh_catch_throw */ -+static CORE_ADDR eh_catch_throw_addr = 0; -+/* Sal for __d_eh_break */ -+static struct symtab_and_line *break_callback_sal = 0; -+ -+/* Code in end.c expects __d_pid to be set in the inferior, -+ otherwise __d_eh_notify_callback doesn't bother to call -+ __d_eh_break! So we poke the pid into this symbol -+ ourselves. -+ 0 => success -+ 1 => failure */ -+int -+setup_d_pid_in_inferior (void) -+{ -+ CORE_ADDR anaddr; -+ struct minimal_symbol *msymbol; -+ char buf[4]; /* FIXME 32x64? */ -+ -+ /* Slam the pid of the process into __d_pid; failing is only a warning! */ -+ msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile); -+ if (msymbol == NULL) -+ { -+ warning ("Unable to find __d_pid symbol in object file."); -+ warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o)."); -+ return 1; -+ } -+ -+ anaddr = SYMBOL_VALUE_ADDRESS (msymbol); -+ store_unsigned_integer (buf, 4, PIDGET (inferior_ptid)); /* FIXME 32x64? */ -+ if (target_write_memory (anaddr, buf, 4)) /* FIXME 32x64? */ -+ { -+ warning ("Unable to write __d_pid"); -+ warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o)."); -+ return 1; -+ } -+ return 0; -+} -+ -+/* elz: Used to lookup a symbol in the shared libraries. -+ This function calls shl_findsym, indirectly through a -+ call to __d_shl_get. __d_shl_get is in end.c, which is always -+ linked in by the hp compilers/linkers. -+ The call to shl_findsym cannot be made directly because it needs -+ to be active in target address space. -+ inputs: - minimal symbol pointer for the function we want to look up -+ - address in target space of the descriptor for the library -+ where we want to look the symbol up. -+ This address is retrieved using the -+ som_solib_get_solib_by_pc function (somsolib.c). -+ output: - real address in the library of the function. -+ note: the handle can be null, in which case shl_findsym will look for -+ the symbol in all the loaded shared libraries. -+ files to look at if you need reference on this stuff: -+ dld.c, dld_shl_findsym.c -+ end.c -+ man entry for shl_findsym */ -+ -+CORE_ADDR -+find_stub_with_shl_get (struct minimal_symbol *function, CORE_ADDR handle) -+{ -+ struct symbol *get_sym, *symbol2; -+ struct minimal_symbol *buff_minsym, *msymbol; -+ struct type *ftype; -+ struct value **args; -+ struct value *funcval; -+ struct value *val; -+ -+ int x, namelen, err_value, tmp = -1; -+ CORE_ADDR endo_buff_addr, value_return_addr, errno_return_addr; -+ CORE_ADDR stub_addr; -+ -+ -+ args = alloca (sizeof (struct value *) * 8); /* 6 for the arguments and one null one??? */ -+ funcval = find_function_in_inferior ("__d_shl_get"); -+ get_sym = lookup_symbol ("__d_shl_get", NULL, VAR_DOMAIN, NULL, NULL); -+ buff_minsym = lookup_minimal_symbol ("__buffer", NULL, NULL); -+ msymbol = lookup_minimal_symbol ("__shldp", NULL, NULL); -+ symbol2 = lookup_symbol ("__shldp", NULL, VAR_DOMAIN, NULL, NULL); -+ endo_buff_addr = SYMBOL_VALUE_ADDRESS (buff_minsym); -+ namelen = strlen (DEPRECATED_SYMBOL_NAME (function)); -+ value_return_addr = endo_buff_addr + namelen; -+ ftype = check_typedef (SYMBOL_TYPE (get_sym)); -+ -+ /* do alignment */ -+ if ((x = value_return_addr % 64) != 0) -+ value_return_addr = value_return_addr + 64 - x; -+ -+ errno_return_addr = value_return_addr + 64; -+ -+ -+ /* set up stuff needed by __d_shl_get in buffer in end.o */ -+ -+ target_write_memory (endo_buff_addr, DEPRECATED_SYMBOL_NAME (function), namelen); -+ -+ target_write_memory (value_return_addr, (char *) &tmp, 4); -+ -+ target_write_memory (errno_return_addr, (char *) &tmp, 4); -+ -+ target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol), -+ (char *) &handle, 4); -+ -+ /* now prepare the arguments for the call */ -+ -+ args[0] = value_from_longest (TYPE_FIELD_TYPE (ftype, 0), 12); -+ args[1] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 1), SYMBOL_VALUE_ADDRESS (msymbol)); -+ args[2] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 2), endo_buff_addr); -+ args[3] = value_from_longest (TYPE_FIELD_TYPE (ftype, 3), TYPE_PROCEDURE); -+ args[4] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 4), value_return_addr); -+ args[5] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 5), errno_return_addr); -+ -+ /* now call the function */ -+ -+ val = call_function_by_hand (funcval, 6, args); -+ -+ /* now get the results */ -+ -+ target_read_memory (errno_return_addr, (char *) &err_value, sizeof (err_value)); -+ -+ target_read_memory (value_return_addr, (char *) &stub_addr, sizeof (stub_addr)); -+ if (stub_addr <= 0) -+ error ("call to __d_shl_get failed, error code is %d", err_value); -+ -+ return (stub_addr); -+} -+ -+/* Cover routine for find_stub_with_shl_get to pass to catch_errors */ -+static int -+cover_find_stub_with_shl_get (void *args_untyped) -+{ -+ args_for_find_stub *args = args_untyped; -+ args->return_val = find_stub_with_shl_get (args->msym, args->solib_handle); -+ return 0; -+} -+ -+/* Initialize exception catchpoint support by looking for the -+ necessary hooks/callbacks in end.o, etc., and set the hook value to -+ point to the required debug function -+ -+ Return 0 => failure -+ 1 => success */ -+ -+static int -+initialize_hp_cxx_exception_support (void) -+{ -+ struct symtabs_and_lines sals; -+ struct cleanup *old_chain; -+ struct cleanup *canonical_strings_chain = NULL; -+ int i; -+ char *addr_start; -+ char *addr_end = NULL; -+ char **canonical = (char **) NULL; -+ int thread = -1; -+ struct symbol *sym = NULL; -+ struct minimal_symbol *msym = NULL; -+ struct objfile *objfile; -+ asection *shlib_info; -+ -+ /* Detect and disallow recursion. On HP-UX with aCC, infinite -+ recursion is a possibility because finding the hook for exception -+ callbacks involves making a call in the inferior, which means -+ re-inserting breakpoints which can re-invoke this code */ -+ -+ static int recurse = 0; -+ if (recurse > 0) -+ { -+ hp_cxx_exception_support_initialized = 0; -+ exception_support_initialized = 0; -+ return 0; -+ } -+ -+ hp_cxx_exception_support = 0; -+ -+ /* First check if we have seen any HP compiled objects; if not, -+ it is very unlikely that HP's idiosyncratic callback mechanism -+ for exception handling debug support will be available! -+ This will percolate back up to breakpoint.c, where our callers -+ will decide to try the g++ exception-handling support instead. */ -+ if (!hp_som_som_object_present) -+ return 0; -+ -+ /* We have a SOM executable with SOM debug info; find the hooks */ -+ -+ /* First look for the notify hook provided by aCC runtime libs */ -+ /* If we find this symbol, we conclude that the executable must -+ have HP aCC exception support built in. If this symbol is not -+ found, even though we're a HP SOM-SOM file, we may have been -+ built with some other compiler (not aCC). This results percolates -+ back up to our callers in breakpoint.c which can decide to -+ try the g++ style of exception support instead. -+ If this symbol is found but the other symbols we require are -+ not found, there is something weird going on, and g++ support -+ should *not* be tried as an alternative. -+ -+ ASSUMPTION: Only HP aCC code will have __eh_notify_hook defined. -+ ASSUMPTION: HP aCC and g++ modules cannot be linked together. */ -+ -+ /* libCsup has this hook; it'll usually be non-debuggable */ -+ msym = lookup_minimal_symbol (HP_ACC_EH_notify_hook, NULL, NULL); -+ if (msym) -+ { -+ eh_notify_hook_addr = SYMBOL_VALUE_ADDRESS (msym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ { -+ warning ("Unable to find exception callback hook (%s).", HP_ACC_EH_notify_hook); -+ warning ("Executable may not have been compiled debuggable with HP aCC."); -+ warning ("GDB will be unable to intercept exception events."); -+ eh_notify_hook_addr = 0; -+ hp_cxx_exception_support = 0; -+ return 0; -+ } -+ -+ /* Next look for the notify callback routine in end.o */ -+ /* This is always available in the SOM symbol dictionary if end.o is linked in */ -+ msym = lookup_minimal_symbol (HP_ACC_EH_notify_callback, NULL, NULL); -+ if (msym) -+ { -+ eh_notify_callback_addr = SYMBOL_VALUE_ADDRESS (msym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ { -+ warning ("Unable to find exception callback routine (%s).", HP_ACC_EH_notify_callback); -+ warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o)."); -+ warning ("GDB will be unable to intercept exception events."); -+ eh_notify_callback_addr = 0; -+ return 0; -+ } -+ -+#ifndef GDB_TARGET_IS_HPPA_20W -+ /* Check whether the executable is dynamically linked or archive bound */ -+ /* With an archive-bound executable we can use the raw addresses we find -+ for the callback function, etc. without modification. For an executable -+ with shared libraries, we have to do more work to find the plabel, which -+ can be the target of a call through $$dyncall from the aCC runtime support -+ library (libCsup) which is linked shared by default by aCC. */ -+ /* This test below was copied from somsolib.c/somread.c. It may not be a very -+ reliable one to test that an executable is linked shared. pai/1997-07-18 */ -+ shlib_info = bfd_get_section_by_name (symfile_objfile->obfd, "$SHLIB_INFO$"); -+ if (shlib_info && (bfd_section_size (symfile_objfile->obfd, shlib_info) != 0)) -+ { -+ /* The minsym we have has the local code address, but that's not the -+ plabel that can be used by an inter-load-module call. */ -+ /* Find solib handle for main image (which has end.o), and use that -+ and the min sym as arguments to __d_shl_get() (which does the equivalent -+ of shl_findsym()) to find the plabel. */ -+ -+ args_for_find_stub args; -+ static char message[] = "Error while finding exception callback hook:\n"; -+ -+ args.solib_handle = som_solib_get_solib_by_pc (eh_notify_callback_addr); -+ args.msym = msym; -+ args.return_val = 0; -+ -+ recurse++; -+ catch_errors (cover_find_stub_with_shl_get, &args, message, -+ RETURN_MASK_ALL); -+ eh_notify_callback_addr = args.return_val; -+ recurse--; -+ -+ exception_catchpoints_are_fragile = 1; -+ -+ if (!eh_notify_callback_addr) -+ { -+ /* We can get here either if there is no plabel in the export list -+ for the main image, or if something strange happened (?) */ -+ warning ("Couldn't find a plabel (indirect function label) for the exception callback."); -+ warning ("GDB will not be able to intercept exception events."); -+ return 0; -+ } -+ } -+ else -+ exception_catchpoints_are_fragile = 0; -+#endif -+ -+ /* Now, look for the breakpointable routine in end.o */ -+ /* This should also be available in the SOM symbol dict. if end.o linked in */ -+ msym = lookup_minimal_symbol (HP_ACC_EH_break, NULL, NULL); -+ if (msym) -+ { -+ eh_break_addr = SYMBOL_VALUE_ADDRESS (msym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ { -+ warning ("Unable to find exception callback routine to set breakpoint (%s).", HP_ACC_EH_break); -+ warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o)."); -+ warning ("GDB will be unable to intercept exception events."); -+ eh_break_addr = 0; -+ return 0; -+ } -+ -+ /* Next look for the catch enable flag provided in end.o */ -+ sym = lookup_symbol (HP_ACC_EH_catch_catch, (struct block *) NULL, -+ VAR_DOMAIN, 0, (struct symtab **) NULL); -+ if (sym) /* sometimes present in debug info */ -+ { -+ eh_catch_catch_addr = SYMBOL_VALUE_ADDRESS (sym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ /* otherwise look in SOM symbol dict. */ -+ { -+ msym = lookup_minimal_symbol (HP_ACC_EH_catch_catch, NULL, NULL); -+ if (msym) -+ { -+ eh_catch_catch_addr = SYMBOL_VALUE_ADDRESS (msym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ { -+ warning ("Unable to enable interception of exception catches."); -+ warning ("Executable may not have been compiled debuggable with HP aCC."); -+ warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o)."); -+ return 0; -+ } -+ } -+ -+ /* Next look for the catch enable flag provided end.o */ -+ sym = lookup_symbol (HP_ACC_EH_catch_catch, (struct block *) NULL, -+ VAR_DOMAIN, 0, (struct symtab **) NULL); -+ if (sym) /* sometimes present in debug info */ -+ { -+ eh_catch_throw_addr = SYMBOL_VALUE_ADDRESS (sym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ /* otherwise look in SOM symbol dict. */ -+ { -+ msym = lookup_minimal_symbol (HP_ACC_EH_catch_throw, NULL, NULL); -+ if (msym) -+ { -+ eh_catch_throw_addr = SYMBOL_VALUE_ADDRESS (msym); -+ hp_cxx_exception_support = 1; -+ } -+ else -+ { -+ warning ("Unable to enable interception of exception throws."); -+ warning ("Executable may not have been compiled debuggable with HP aCC."); -+ warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o)."); -+ return 0; -+ } -+ } -+ -+ /* Set the flags */ -+ hp_cxx_exception_support = 2; /* everything worked so far */ -+ hp_cxx_exception_support_initialized = 1; -+ exception_support_initialized = 1; -+ -+ return 1; -+} -+ -+/* Target operation for enabling or disabling interception of -+ exception events. -+ KIND is either EX_EVENT_THROW or EX_EVENT_CATCH -+ ENABLE is either 0 (disable) or 1 (enable). -+ Return value is NULL if no support found; -+ -1 if something went wrong, -+ or a pointer to a symtab/line struct if the breakpointable -+ address was found. */ -+ -+struct symtab_and_line * -+child_enable_exception_callback (enum exception_event_kind kind, int enable) -+{ -+ char buf[4]; -+ -+ if (!exception_support_initialized || !hp_cxx_exception_support_initialized) -+ if (!initialize_hp_cxx_exception_support ()) -+ return NULL; -+ -+ switch (hp_cxx_exception_support) -+ { -+ case 0: -+ /* Assuming no HP support at all */ -+ return NULL; -+ case 1: -+ /* HP support should be present, but something went wrong */ -+ return (struct symtab_and_line *) -1; /* yuck! */ -+ /* there may be other cases in the future */ -+ } -+ -+ /* Set the EH hook to point to the callback routine */ -+ store_unsigned_integer (buf, 4, enable ? eh_notify_callback_addr : 0); /* FIXME 32x64 problem */ -+ /* pai: (temp) FIXME should there be a pack operation first? */ -+ if (target_write_memory (eh_notify_hook_addr, buf, 4)) /* FIXME 32x64 problem */ -+ { -+ warning ("Could not write to target memory for exception event callback."); -+ warning ("Interception of exception events may not work."); -+ return (struct symtab_and_line *) -1; -+ } -+ if (enable) -+ { -+ /* Ensure that __d_pid is set up correctly -- end.c code checks this. :-( */ -+ if (PIDGET (inferior_ptid) > 0) -+ { -+ if (setup_d_pid_in_inferior ()) -+ return (struct symtab_and_line *) -1; -+ } -+ else -+ { -+ warning ("Internal error: Invalid inferior pid? Cannot intercept exception events."); -+ return (struct symtab_and_line *) -1; -+ } -+ } -+ -+ switch (kind) -+ { -+ case EX_EVENT_THROW: -+ store_unsigned_integer (buf, 4, enable ? 1 : 0); -+ if (target_write_memory (eh_catch_throw_addr, buf, 4)) /* FIXME 32x64? */ -+ { -+ warning ("Couldn't enable exception throw interception."); -+ return (struct symtab_and_line *) -1; -+ } -+ break; -+ case EX_EVENT_CATCH: -+ store_unsigned_integer (buf, 4, enable ? 1 : 0); -+ if (target_write_memory (eh_catch_catch_addr, buf, 4)) /* FIXME 32x64? */ -+ { -+ warning ("Couldn't enable exception catch interception."); -+ return (struct symtab_and_line *) -1; -+ } -+ break; -+ default: -+ error ("Request to enable unknown or unsupported exception event."); -+ } -+ -+ /* Copy break address into new sal struct, malloc'ing if needed. */ -+ if (!break_callback_sal) -+ { -+ break_callback_sal = (struct symtab_and_line *) xmalloc (sizeof (struct symtab_and_line)); -+ } -+ init_sal (break_callback_sal); -+ break_callback_sal->symtab = NULL; -+ break_callback_sal->pc = eh_break_addr; -+ break_callback_sal->line = 0; -+ break_callback_sal->end = eh_break_addr; -+ -+ return break_callback_sal; -+} -+ -+/* Record some information about the current exception event */ -+static struct exception_event_record current_ex_event; -+/* Convenience struct */ -+static struct symtab_and_line null_symtab_and_line = -+{NULL, 0, 0, 0}; -+ -+/* Report current exception event. Returns a pointer to a record -+ that describes the kind of the event, where it was thrown from, -+ and where it will be caught. More information may be reported -+ in the future */ -+struct exception_event_record * -+child_get_current_exception_event (void) -+{ -+ CORE_ADDR event_kind; -+ CORE_ADDR throw_addr; -+ CORE_ADDR catch_addr; -+ struct frame_info *fi, *curr_frame; -+ int level = 1; -+ -+ curr_frame = get_current_frame (); -+ if (!curr_frame) -+ return (struct exception_event_record *) NULL; -+ -+ /* Go up one frame to __d_eh_notify_callback, because at the -+ point when this code is executed, there's garbage in the -+ arguments of __d_eh_break. */ -+ fi = find_relative_frame (curr_frame, &level); -+ if (level != 0) -+ return (struct exception_event_record *) NULL; -+ -+ select_frame (fi); -+ -+ /* Read in the arguments */ -+ /* __d_eh_notify_callback() is called with 3 arguments: -+ 1. event kind catch or throw -+ 2. the target address if known -+ 3. a flag -- not sure what this is. pai/1997-07-17 */ -+ event_kind = read_register (ARG0_REGNUM); -+ catch_addr = read_register (ARG1_REGNUM); -+ -+ /* Now go down to a user frame */ -+ /* For a throw, __d_eh_break is called by -+ __d_eh_notify_callback which is called by -+ __notify_throw which is called -+ from user code. -+ For a catch, __d_eh_break is called by -+ __d_eh_notify_callback which is called by -+ <stackwalking stuff> which is called by -+ __throw__<stuff> or __rethrow_<stuff> which is called -+ from user code. */ -+ /* FIXME: Don't use such magic numbers; search for the frames */ -+ level = (event_kind == EX_EVENT_THROW) ? 3 : 4; -+ fi = find_relative_frame (curr_frame, &level); -+ if (level != 0) -+ return (struct exception_event_record *) NULL; -+ -+ select_frame (fi); -+ throw_addr = get_frame_pc (fi); -+ -+ /* Go back to original (top) frame */ -+ select_frame (curr_frame); -+ -+ current_ex_event.kind = (enum exception_event_kind) event_kind; -+ current_ex_event.throw_sal = find_pc_line (throw_addr, 1); -+ current_ex_event.catch_sal = find_pc_line (catch_addr, 1); -+ -+ return ¤t_ex_event; -+} -+ - static void - hppa_hpux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) - { -- set_gdbarch_pc_in_sigtramp (gdbarch, hppa_hpux_pc_in_sigtramp); -+ set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, hppa_hpux_pc_in_sigtramp); - } - - static void -diff -uNr gdb-6.1.orig/gdb/hppa-linux-nat.c gdb-6.1/gdb/hppa-linux-nat.c ---- gdb-6.1.orig/gdb/hppa-linux-nat.c 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/hppa-linux-nat.c 2004-06-06 20:19:05.443337968 +0000 -@@ -0,0 +1,355 @@ -+/* Functions specific to running gdb native on HPPA running Linux. -+ Copyright 2004 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, -+ Boston, MA 02111-1307, USA. */ -+ -+#include "defs.h" -+#include "inferior.h" -+#include "gdbcore.h" -+#include "regcache.h" -+#include "linux-nat.h" -+ -+#include "gdb_assert.h" -+#include "gdb_string.h" -+#include <sys/ptrace.h> -+#include <sys/user.h> -+#include <sys/procfs.h> -+#include <string.h> -+#include <linux/version.h> -+ -+#ifdef HAVE_SYS_REG_H -+#include <sys/reg.h> -+#endif -+ -+#if LINUX_VERSION_CODE < 0x02052c -+#include <asm/offset.h> -+#else -+#include <asm/offsets.h> -+#endif -+ -+/* Prototypes for supply_gregset etc. */ -+#include "gregset.h" -+ -+#include "hppa-linux-tdep.h" -+ -+/* These must match the order of the register names. -+ -+ Some sort of lookup table is needed because the offsets associated -+ with the registers are all over the board. */ -+ -+static const int u_offsets[] = -+ { -+ /* general registers */ -+ -1, -+ PT_GR1, -+ PT_GR2, -+ PT_GR3, -+ PT_GR4, -+ PT_GR5, -+ PT_GR6, -+ PT_GR7, -+ PT_GR8, -+ PT_GR9, -+ PT_GR10, -+ PT_GR11, -+ PT_GR12, -+ PT_GR13, -+ PT_GR14, -+ PT_GR15, -+ PT_GR16, -+ PT_GR17, -+ PT_GR18, -+ PT_GR19, -+ PT_GR20, -+ PT_GR21, -+ PT_GR22, -+ PT_GR23, -+ PT_GR24, -+ PT_GR25, -+ PT_GR26, -+ PT_GR27, -+ PT_GR28, -+ PT_GR29, -+ PT_GR30, -+ PT_GR31, -+ -+ PT_SAR, -+ PT_IAOQ0, -+ PT_IASQ0, -+ PT_IAOQ1, -+ PT_IASQ1, -+ -1, /* eiem */ -+ PT_IIR, -+ PT_ISR, -+ PT_IOR, -+ PT_PSW, -+ -1, /* goto */ -+ -+ PT_SR4, -+ PT_SR0, -+ PT_SR1, -+ PT_SR2, -+ PT_SR3, -+ PT_SR5, -+ PT_SR6, -+ PT_SR7, -+ -+ -1, /* cr0 */ -+ -1, /* pid0 */ -+ -1, /* pid1 */ -+ -1, /* ccr */ -+ -1, /* pid2 */ -+ -1, /* pid3 */ -+ -1, /* cr24 */ -+ -1, /* cr25 */ -+ -1, /* cr26 */ -+ PT_CR27, -+ -1, /* cr28 */ -+ -1, /* cr29 */ -+ -1, /* cr30 */ -+ -+ /* Floating point regs. */ -+ PT_FR0, PT_FR0 + 4, -+ PT_FR1, PT_FR1 + 4, -+ PT_FR2, PT_FR2 + 4, -+ PT_FR3, PT_FR3 + 4, -+ PT_FR4, PT_FR4 + 4, -+ PT_FR5, PT_FR5 + 4, -+ PT_FR6, PT_FR6 + 4, -+ PT_FR7, PT_FR7 + 4, -+ PT_FR8, PT_FR8 + 4, -+ PT_FR9, PT_FR9 + 4, -+ PT_FR10, PT_FR10 + 4, -+ PT_FR11, PT_FR11 + 4, -+ PT_FR12, PT_FR12 + 4, -+ PT_FR13, PT_FR13 + 4, -+ PT_FR14, PT_FR14 + 4, -+ PT_FR15, PT_FR15 + 4, -+ PT_FR16, PT_FR16 + 4, -+ PT_FR17, PT_FR17 + 4, -+ PT_FR18, PT_FR18 + 4, -+ PT_FR19, PT_FR19 + 4, -+ PT_FR20, PT_FR20 + 4, -+ PT_FR21, PT_FR21 + 4, -+ PT_FR22, PT_FR22 + 4, -+ PT_FR23, PT_FR23 + 4, -+ PT_FR24, PT_FR24 + 4, -+ PT_FR25, PT_FR25 + 4, -+ PT_FR26, PT_FR26 + 4, -+ PT_FR27, PT_FR27 + 4, -+ PT_FR28, PT_FR28 + 4, -+ PT_FR29, PT_FR29 + 4, -+ PT_FR30, PT_FR30 + 4, -+ PT_FR31, PT_FR31 + 4, -+ }; -+ -+CORE_ADDR -+register_addr (int regno, CORE_ADDR blockend) -+{ -+ CORE_ADDR addr; -+ -+ if ((unsigned) regno >= NUM_REGS) -+ error ("Invalid register number %d.", regno); -+ -+ if (u_offsets[regno] == -1) -+ addr = 0; -+ else -+ { -+ addr = (CORE_ADDR) u_offsets[regno]; -+ } -+ -+ return addr; -+} -+ -+int pa_cannot_fetch_register (regno) -+ int regno; -+{ -+ return (unsigned int) regno >= NUM_REGS || u_offsets[regno] == -1; -+} -+ -+int pa_cannot_store_register (regno) -+ int regno; -+{ -+ return ((unsigned int) regno >= NUM_REGS -+ || regno == PA_GR0_REGNUM -+ || regno == PA_PCSQ_HEAD_REGNUM -+ || (regno >= PA_PCSQ_TAIL_REGNUM && regno < PA_IPSW_REGNUM) -+ || (regno > PA_IPSW_REGNUM && regno < PA_FR4_REGNUM)); -+} -+ -+static const int greg_map[] = -+ { -+ PA_GR0_REGNUM, -+ PA_GR1_REGNUM, -+ PA_GR2_REGNUM, -+ PA_GR3_REGNUM, -+ PA_GR4_REGNUM, -+ PA_GR5_REGNUM, -+ PA_GR6_REGNUM, -+ PA_GR7_REGNUM, -+ PA_GR8_REGNUM, -+ PA_GR9_REGNUM, -+ PA_GR10_REGNUM, -+ PA_GR11_REGNUM, -+ PA_GR12_REGNUM, -+ PA_GR13_REGNUM, -+ PA_GR14_REGNUM, -+ PA_GR15_REGNUM, -+ PA_GR16_REGNUM, -+ PA_GR17_REGNUM, -+ PA_GR18_REGNUM, -+ PA_GR19_REGNUM, -+ PA_GR20_REGNUM, -+ PA_GR21_REGNUM, -+ PA_GR22_REGNUM, -+ PA_GR23_REGNUM, -+ PA_GR24_REGNUM, -+ PA_GR25_REGNUM, -+ PA_GR26_REGNUM, -+ PA_GR27_REGNUM, -+ PA_GR28_REGNUM, -+ PA_GR29_REGNUM, -+ PA_GR30_REGNUM, -+ PA_GR31_REGNUM, -+ PA_SR0_REGNUM, -+ PA_SR1_REGNUM, -+ PA_SR2_REGNUM, -+ PA_SR3_REGNUM, -+ PA_SR4_REGNUM, -+ PA_SR5_REGNUM, -+ PA_SR6_REGNUM, -+ PA_SR7_REGNUM, -+ PA_PCOQ_HEAD_REGNUM, -+ PA_PCOQ_TAIL_REGNUM, -+ PA_PCSQ_HEAD_REGNUM, -+ PA_PCSQ_TAIL_REGNUM, -+ PA_CR11_REGNUM, -+ PA_CR19_REGNUM, -+ PA_CR20_REGNUM, -+ PA_CR21_REGNUM, -+ PA_CR22_REGNUM, -+ PA_CR0_REGNUM, -+ PA_CR24_REGNUM, -+ PA_CR25_REGNUM, -+ PA_CR26_REGNUM, -+ PA_CR27_REGNUM, -+ PA_CR28_REGNUM, -+ PA_CR29_REGNUM, -+ PA_CR30_REGNUM, -+ PA_CR31_REGNUM, -+ PA_CR8_REGNUM, -+ PA_CR9_REGNUM, -+ PA_CR12_REGNUM, -+ PA_CR13_REGNUM, -+ PA_CR10_REGNUM, -+ PA_CR15_REGNUM -+ }; -+ -+void -+supply_gregset (gdb_gregset_t *gregsetp) -+{ -+ int i; -+ greg_t *regp = (greg_t *) gregsetp; -+ -+ for (i = 0; i < sizeof (greg_map) / sizeof (greg_map[0]); i++, regp++) -+ { -+ int regno = greg_map[i]; -+ /* When running a 64 bit kernel, a greg_t may be larger than the -+ actual register, so just pick off the LS bits of big-endian word. */ -+ supply_register (regno, -+ ((char *) (regp + 1)) - register_size (current_gdbarch, regno)); -+ } -+} -+ -+void -+fill_gregset (gdb_gregset_t *gregsetp, int regno) -+{ -+ int i; -+ greg_t *regp = (greg_t *) gregsetp; -+ -+ memset (gregsetp, 0, sizeof (*gregsetp)); -+ for (i = 0; i < sizeof (greg_map) / sizeof (greg_map[0]); i++, regp++) -+ { -+ int regi = greg_map[i]; -+ -+ if (regno == -1 || regi == regno) -+ { -+ int rawsize = register_size (current_gdbarch, regi); -+ regcache_collect (regi, ((char *) (regp + 1)) - rawsize); -+ } -+ } -+} -+ -+/* Given a pointer to a floating point register set in /proc format -+ (fpregset_t *), unpack the register contents and supply them as gdb's -+ idea of the current floating point register values. */ -+ -+void -+supply_fpregset (gdb_fpregset_t *fpregsetp) -+{ -+ register int regi; -+ char *from; -+ -+ for (regi = 0; regi <= 31; regi++) -+ { -+ from = (char *) &((*fpregsetp)[regi]); -+ supply_register (2*regi + PA_FR0_REGNUM, from); -+ supply_register (2*regi + PA_FR0_REGNUM + 1, from + 4); -+ } -+} -+ -+/* Given a pointer to a floating point register set in /proc format -+ (fpregset_t *), update the register specified by REGNO from gdb's idea -+ of the current floating point register set. If REGNO is -1, update -+ them all. */ -+ -+void -+fill_fpregset (gdb_fpregset_t *fpregsetp, int regno) -+{ -+ if (regno == -1) -+ deprecated_read_register_bytes (DEPRECATED_REGISTER_BYTE (PA_FR0_REGNUM), -+ (char *)fpregsetp, -+ 32 * 2 * DEPRECATED_REGISTER_RAW_SIZE (PA_FR0_REGNUM)); -+ else -+ { -+ /* Gross. fpregset_t is double, registers[x] has single -+ precision reg. */ -+ char *to = (char *) &((*fpregsetp)[(regno - PA_FR0_REGNUM) / 2]); -+ if ((regno - PA_FR0_REGNUM) & 1) -+ to += 4; -+ regcache_collect (regno, to); -+ } -+} -+ -+int -+pa_linux_insert_watchpoint (int pid, CORE_ADDR addr, int len, int rw) -+{ -+ return -1; -+} -+ -+int -+pa_linux_remove_watchpoint (int pid, CORE_ADDR addr, int len) -+{ -+ return -1; -+} -+ -+CORE_ADDR -+pa_linux_stopped_by_watchpoint (int pid) -+{ -+ return 0; -+} -diff -uNr gdb-6.1.orig/gdb/hppa-linux-tdep.c gdb-6.1/gdb/hppa-linux-tdep.c ---- gdb-6.1.orig/gdb/hppa-linux-tdep.c 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/hppa-linux-tdep.c 2004-06-06 20:16:53.708364728 +0000 -@@ -0,0 +1,58 @@ -+/* Target-dependent code for Linux running on PA-RISC, for GDB. -+ -+ Copyright 2004 Free Software Foundation, Inc. -+ -+This file is part of GDB. -+ -+This program is free software; you can redistribute it and/or modify -+it under the terms of the GNU General Public License as published by -+the Free Software Foundation; either version 2 of the License, or -+(at your option) any later version. -+ -+This program is distributed in the hope that it will be useful, -+but WITHOUT ANY WARRANTY; without even the implied warranty of -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+GNU General Public License for more details. -+ -+You should have received a copy of the GNU General Public License -+along with this program; if not, write to the Free Software -+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -+ -+#include "defs.h" -+#include "arch-utils.h" -+#include "gdbcore.h" -+#include "osabi.h" -+#include "gdb_string.h" -+#include "frame.h" -+#include "inferior.h" -+#include "target.h" -+#include "objfiles.h" -+#include "elf/common.h" -+#include "solib-svr4.h" -+#include "glibc-tdep.h" -+ -+#include "hppa-linux-tdep.h" -+ -+/* Forward declarations. */ -+extern initialize_file_ftype _initialize_hppa_linux_tdep; -+ -+static void -+hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ -+ /* GNU/Linux uses SVR4-style shared libraries. */ -+ set_solib_svr4_fetch_link_map_offsets -+ (gdbarch, svr4_ilp32_fetch_link_map_offsets); -+ -+ /* GNU/Linux uses the dynamic linker included in the GNU C Library. */ -+ set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); -+} -+ -+void -+_initialize_hppa_linux_tdep (void) -+{ -+ gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_LINUX, hppa_linux_init_abi); -+} -+ -+ -diff -uNr gdb-6.1.orig/gdb/hppa-linux-tdep.h gdb-6.1/gdb/hppa-linux-tdep.h ---- gdb-6.1.orig/gdb/hppa-linux-tdep.h 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.1/gdb/hppa-linux-tdep.h 2004-06-06 20:16:53.712364120 +0000 -@@ -0,0 +1,140 @@ -+/* Definitions to target GDB to any Hewlett-Packard PA-RISC machine. -+ Copyright 2004 Free Software Foundation, Inc. -+ -+ Contributed by Randolph Chung <tausq@debian.org> -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, -+ Boston, MA 02111-1307, USA. */ -+ -+#ifndef HPPA_LINUX_TDEP_H -+#define HPPA_LINUX_TDEP_H -+ -+#include "hppa-tdep.h" -+ -+/* Register numbers of various registers, */ -+ -+/* General registers. */ -+#define PA_GR0_REGNUM 0 -+#define PA_GR1_REGNUM (PA_GR0_REGNUM+1) -+#define PA_GR2_REGNUM (PA_GR0_REGNUM+2) -+#define PA_GR3_REGNUM (PA_GR0_REGNUM+3) -+#define PA_GR4_REGNUM (PA_GR0_REGNUM+4) -+#define PA_GR5_REGNUM (PA_GR0_REGNUM+5) -+#define PA_GR6_REGNUM (PA_GR0_REGNUM+6) -+#define PA_GR7_REGNUM (PA_GR0_REGNUM+7) -+#define PA_GR8_REGNUM (PA_GR0_REGNUM+8) -+#define PA_GR9_REGNUM (PA_GR0_REGNUM+9) -+#define PA_GR10_REGNUM (PA_GR0_REGNUM+10) -+#define PA_GR11_REGNUM (PA_GR0_REGNUM+11) -+#define PA_GR12_REGNUM (PA_GR0_REGNUM+12) -+#define PA_GR13_REGNUM (PA_GR0_REGNUM+13) -+#define PA_GR14_REGNUM (PA_GR0_REGNUM+14) -+#define PA_GR15_REGNUM (PA_GR0_REGNUM+15) -+#define PA_GR16_REGNUM (PA_GR0_REGNUM+16) -+#define PA_GR17_REGNUM (PA_GR0_REGNUM+17) -+#define PA_GR18_REGNUM (PA_GR0_REGNUM+18) -+#define PA_GR19_REGNUM (PA_GR0_REGNUM+19) -+#define PA_GR20_REGNUM (PA_GR0_REGNUM+20) -+#define PA_GR21_REGNUM (PA_GR0_REGNUM+21) -+#define PA_GR22_REGNUM (PA_GR0_REGNUM+22) -+#define PA_GR23_REGNUM (PA_GR0_REGNUM+23) -+#define PA_GR24_REGNUM (PA_GR0_REGNUM+24) -+#define PA_GR25_REGNUM (PA_GR0_REGNUM+25) -+#define PA_GR26_REGNUM (PA_GR0_REGNUM+26) -+#define PA_GR27_REGNUM (PA_GR0_REGNUM+27) -+#define PA_GR28_REGNUM (PA_GR0_REGNUM+28) -+#define PA_GR29_REGNUM (PA_GR0_REGNUM+29) -+#define PA_GR30_REGNUM (PA_GR0_REGNUM+30) -+#define PA_GR31_REGNUM (PA_GR0_REGNUM+31) -+ -+/* Control registers. The peculiar layout is to match HPUX interrupt save -+ state. */ -+#define PA_CR11_REGNUM 32 -+#define PA_PCOQ_HEAD_REGNUM 33 /* CR18 */ -+#define PA_PCSQ_HEAD_REGNUM 34 /* CR17 */ -+#define PA_PCOQ_TAIL_REGNUM 35 /* CR18 */ -+#define PA_PCSQ_TAIL_REGNUM 36 /* CR17 */ -+#define PA_CR15_REGNUM 37 -+#define PA_CR19_REGNUM 38 -+#define PA_CR20_REGNUM 39 -+#define PA_CR21_REGNUM 40 -+#define PA_CR22_REGNUM 41 -+#define PA_CR31_REGNUM 42 -+ -+/* Space registers. */ -+#define PA_SR4_REGNUM 43 -+#define PA_SR0_REGNUM 44 -+#define PA_SR1_REGNUM 45 -+#define PA_SR2_REGNUM 46 -+#define PA_SR3_REGNUM 47 -+#define PA_SR5_REGNUM 48 -+#define PA_SR6_REGNUM 49 -+#define PA_SR7_REGNUM 50 -+ -+/* More control regs. */ -+#define PA_CR0_REGNUM 51 -+#define PA_CR8_REGNUM 52 -+#define PA_CR9_REGNUM 53 -+#define PA_CR10_REGNUM 54 -+#define PA_CR12_REGNUM 55 -+#define PA_CR13_REGNUM 56 -+#define PA_CR24_REGNUM 57 -+#define PA_CR25_REGNUM 58 -+#define PA_CR26_REGNUM 59 -+#define PA_CR27_REGNUM 60 -+#define PA_CR28_REGNUM 61 -+#define PA_CR29_REGNUM 62 -+#define PA_CR30_REGNUM 63 -+ -+/* Floating point registers. */ -+#define PA_FR0_REGNUM 64 -+#define PA_FR1_REGNUM (PA_FR0_REGNUM+2) -+#define PA_FR2_REGNUM (PA_FR0_REGNUM+4) -+#define PA_FR3_REGNUM (PA_FR0_REGNUM+6) -+#define PA_FR4_REGNUM (PA_FR0_REGNUM+8) -+#define PA_FR5_REGNUM (PA_FR0_REGNUM+10) -+#define PA_FR6_REGNUM (PA_FR0_REGNUM+12) -+#define PA_FR7_REGNUM (PA_FR0_REGNUM+14) -+#define PA_FR31_REGNUM (PA_FR0_REGNUM+62) -+ -+/* Some aliases. */ -+#define PA_FLAGS_REGNUM PA_GR0_REGNUM -+#define PA_SAR_REGNUM PA_CR11_REGNUM -+#define PA_IPSW_REGNUM PA_CR22_REGNUM -+ -+/* -+ * Processor Status Word Masks -+ */ -+ -+#define PSW_T 0x01000000 /* Taken Branch Trap Enable */ -+#define PSW_H 0x00800000 /* Higher-Privilege Transfer Trap Enable */ -+#define PSW_L 0x00400000 /* Lower-Privilege Transfer Trap Enable */ -+#define PSW_N 0x00200000 /* PC Queue Front Instruction Nullified */ -+#define PSW_X 0x00100000 /* Data Memory Break Disable */ -+#define PSW_B 0x00080000 /* Taken Branch in Previous Cycle */ -+#define PSW_C 0x00040000 /* Code Address Translation Enable */ -+#define PSW_V 0x00020000 /* Divide Step Correction */ -+#define PSW_M 0x00010000 /* High-Priority Machine Check Disable */ -+#define PSW_CB 0x0000ff00 /* Carry/Borrow Bits */ -+#define PSW_R 0x00000010 /* Recovery Counter Enable */ -+#define PSW_Q 0x00000008 /* Interruption State Collection Enable */ -+#define PSW_P 0x00000004 /* Protection ID Validation Enable */ -+#define PSW_D 0x00000002 /* Data Address Translation Enable */ -+#define PSW_I 0x00000001 /* External, Power Failure, Low-Priority */ -+ /* Machine Check Interruption Enable */ -+#endif -+ -diff -uNr gdb-6.1.orig/gdb/hppa-tdep.c gdb-6.1/gdb/hppa-tdep.c ---- gdb-6.1.orig/gdb/hppa-tdep.c 2004-06-06 20:16:23.578945096 +0000 -+++ gdb-6.1/gdb/hppa-tdep.c 2004-06-06 20:16:53.773354848 +0000 -@@ -48,12 +48,10 @@ - #include <sys/types.h> - #endif - --#include <dl.h> - #include <sys/param.h> - #include <signal.h> - - #include <sys/ptrace.h> --#include <machine/save_state.h> - - #ifdef COFF_ENCAPSULATE - #include "a.out.encap.h" -@@ -76,26 +74,12 @@ - static const int hppa32_num_regs = 128; - static const int hppa64_num_regs = 96; - --static const int hppa64_call_dummy_breakpoint_offset = 22 * 4; -- --/* DEPRECATED_CALL_DUMMY_LENGTH is computed based on the size of a -- word on the target machine, not the size of an instruction. Since -- a word on this target holds two instructions we have to divide the -- instruction size by two to get the word size of the dummy. */ --static const int hppa32_call_dummy_length = INSTRUCTION_SIZE * 28; --static const int hppa64_call_dummy_length = INSTRUCTION_SIZE * 26 / 2; -- - /* Get at various relevent fields of an instruction word. */ - #define MASK_5 0x1f - #define MASK_11 0x7ff - #define MASK_14 0x3fff - #define MASK_21 0x1fffff - --/* Define offsets into the call dummy for the target function address. -- See comments related to CALL_DUMMY for more info. */ --#define FUNC_LDIL_OFFSET (INSTRUCTION_SIZE * 9) --#define FUNC_LDO_OFFSET (INSTRUCTION_SIZE * 10) -- - /* Define offsets into the call dummy for the _sr4export address. - See comments related to CALL_DUMMY for more info. */ - #define SR4EXPORT_LDIL_OFFSET (INSTRUCTION_SIZE * 12) -@@ -118,24 +102,12 @@ - - static unsigned extract_5r_store (unsigned int); - --static void hppa_frame_init_saved_regs (struct frame_info *frame); -- --static void find_dummy_frame_regs (struct frame_info *, CORE_ADDR *); -- --static int find_proc_framesize (CORE_ADDR); -- --static int find_return_regnum (CORE_ADDR); -- - struct unwind_table_entry *find_unwind_entry (CORE_ADDR); - - static int extract_17 (unsigned int); - --static unsigned deposit_21 (unsigned int, unsigned int); -- - static int extract_21 (unsigned); - --static unsigned deposit_14 (int, unsigned int); -- - static int extract_14 (unsigned); - - static void unwind_command (char *, int); -@@ -144,8 +116,6 @@ - - static int sign_extend (unsigned int, unsigned int); - --static int restore_pc_queue (CORE_ADDR *); -- - static int hppa_alignof (struct type *); - - static int prologue_inst_adjust_sp (unsigned long); -@@ -156,10 +126,6 @@ - - static int inst_saves_fr (unsigned long); - --static int pc_in_interrupt_handler (CORE_ADDR); -- --static int pc_in_linker_stub (CORE_ADDR); -- - static int compare_unwind_entries (const void *, const void *); - - static void read_unwind_info (struct objfile *); -@@ -168,11 +134,6 @@ - struct unwind_table_entry *, - asection *, unsigned int, - unsigned int, CORE_ADDR); --static void pa_print_registers (char *, int, int); --static void pa_strcat_registers (char *, int, int, struct ui_file *); --static void pa_register_look_aside (char *, int, long *); --static void pa_print_fp_reg (int); --static void pa_strcat_fp_reg (int, struct ui_file *, enum precision_type); - static void record_text_segment_lowaddr (bfd *, asection *, void *); - /* FIXME: brobecker 2002-11-07: We will likely be able to make the - following functions static, once we hppa is partially multiarched. */ -@@ -181,67 +142,16 @@ - CORE_ADDR hppa_skip_trampoline_code (CORE_ADDR pc); - int hppa_in_solib_call_trampoline (CORE_ADDR pc, char *name); - int hppa_in_solib_return_trampoline (CORE_ADDR pc, char *name); --CORE_ADDR hppa_saved_pc_after_call (struct frame_info *frame); - int hppa_inner_than (CORE_ADDR lhs, CORE_ADDR rhs); --CORE_ADDR hppa64_stack_align (CORE_ADDR sp); - int hppa_pc_requires_run_before_use (CORE_ADDR pc); - int hppa_instruction_nullified (void); --int hppa_register_raw_size (int reg_nr); --int hppa_register_byte (int reg_nr); --struct type * hppa32_register_virtual_type (int reg_nr); --struct type * hppa64_register_virtual_type (int reg_nr); --void hppa_store_struct_return (CORE_ADDR addr, CORE_ADDR sp); --void hppa64_extract_return_value (struct type *type, char *regbuf, -- char *valbuf); --int hppa64_use_struct_convention (int gcc_p, struct type *type); --void hppa64_store_return_value (struct type *type, char *valbuf); - int hppa_cannot_store_register (int regnum); --void hppa_init_extra_frame_info (int fromleaf, struct frame_info *frame); --CORE_ADDR hppa_frame_chain (struct frame_info *frame); --int hppa_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe); --int hppa_frameless_function_invocation (struct frame_info *frame); --CORE_ADDR hppa_frame_saved_pc (struct frame_info *frame); --CORE_ADDR hppa_frame_args_address (struct frame_info *fi); --int hppa_frame_num_args (struct frame_info *frame); --void hppa_push_dummy_frame (void); --void hppa_pop_frame (void); --CORE_ADDR hppa_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, -- int nargs, struct value **args, -- struct type *type, int gcc_p); --CORE_ADDR hppa_push_arguments (int nargs, struct value **args, CORE_ADDR sp, -- int struct_return, CORE_ADDR struct_addr); - CORE_ADDR hppa_smash_text_address (CORE_ADDR addr); - CORE_ADDR hppa_target_read_pc (ptid_t ptid); - void hppa_target_write_pc (CORE_ADDR v, ptid_t ptid); --CORE_ADDR hppa_target_read_fp (void); -- --typedef struct -- { -- struct minimal_symbol *msym; -- CORE_ADDR solib_handle; -- CORE_ADDR return_val; -- } --args_for_find_stub; -- --static int cover_find_stub_with_shl_get (void *); - - static int is_pa_2 = 0; /* False */ - --/* This is declared in symtab.c; set to 1 in hp-symtab-read.c */ --extern int hp_som_som_object_present; -- --/* In breakpoint.c */ --extern int exception_catchpoints_are_fragile; -- --/* Should call_function allocate stack space for a struct return? */ -- --int --hppa64_use_struct_convention (int gcc_p, struct type *type) --{ -- /* RM: struct upto 128 bits are returned in registers */ -- return TYPE_LENGTH (type) > 16; --} -- - /* Handle 32/64-bit struct return conventions. */ - - static enum return_value_convention -@@ -303,7 +213,8 @@ - are in r28, padded on the left. Aggregates less that 65 bits are - in r28, right padded. Aggregates upto 128 bits are in r28 and - r29, right padded. */ -- if (TYPE_CODE (type) == TYPE_CODE_FLT) -+ if (TYPE_CODE (type) == TYPE_CODE_FLT -+ && TYPE_LENGTH (type) <= 8) - { - /* Floats are right aligned? */ - int offset = register_size (gdbarch, FP4_REGNUM) - TYPE_LENGTH (type); -@@ -333,15 +244,15 @@ - int b; - for (b = 0; b < TYPE_LENGTH (type); b += 8) - { -- int part = (TYPE_LENGTH (type) - b - 1) % 8 + 1; -+ int part = min (8, TYPE_LENGTH (type) - b); - if (readbuf != NULL) -- regcache_cooked_read_part (regcache, 28, 0, part, -+ regcache_cooked_read_part (regcache, 28 + b / 8, 0, part, - (char *) readbuf + b); - if (writebuf != NULL) -- regcache_cooked_write_part (regcache, 28, 0, part, -+ regcache_cooked_write_part (regcache, 28 + b / 8, 0, part, - (const char *) writebuf + b); - } -- return RETURN_VALUE_REGISTER_CONVENTION; -+ return RETURN_VALUE_REGISTER_CONVENTION; - } - else - return RETURN_VALUE_STRUCT_CONVENTION; -@@ -408,16 +319,6 @@ - return low_sign_extend (word & MASK_14, 14); - } - --/* deposit a 14 bit constant in a word */ -- --static unsigned --deposit_14 (int opnd, unsigned word) --{ -- unsigned sign = (opnd < 0 ? 1 : 0); -- -- return word | ((unsigned) opnd << 1 & MASK_14) | sign; --} -- - /* extract a 21 bit constant */ - - static int -@@ -439,27 +340,6 @@ - return sign_extend (val, 21) << 11; - } - --/* deposit a 21 bit constant in a word. Although 21 bit constants are -- usually the top 21 bits of a 32 bit constant, we assume that only -- the low 21 bits of opnd are relevant */ -- --static unsigned --deposit_21 (unsigned opnd, unsigned word) --{ -- unsigned val = 0; -- -- val |= get_field (opnd, 11 + 14, 11 + 18); -- val <<= 2; -- val |= get_field (opnd, 11 + 12, 11 + 13); -- val <<= 2; -- val |= get_field (opnd, 11 + 19, 11 + 20); -- val <<= 11; -- val |= get_field (opnd, 11 + 1, 11 + 11); -- val <<= 1; -- val |= get_field (opnd, 11 + 0, 11 + 0); -- return word | val; --} -- - /* extract a 17 bit constant from branch instructions, returning the - 19 bit signed value. */ - -@@ -902,2496 +782,334 @@ - return u->Total_frame_size << 3; - } - --/* Called to determine if PC is in an interrupt handler of some -- kind. */ -- --static int --pc_in_interrupt_handler (CORE_ADDR pc) --{ -- struct unwind_table_entry *u; -- struct minimal_symbol *msym_us; -- -- u = find_unwind_entry (pc); -- if (!u) -- return 0; -- -- /* Oh joys. HPUX sets the interrupt bit for _sigreturn even though -- its frame isn't a pure interrupt frame. Deal with this. */ -- msym_us = lookup_minimal_symbol_by_pc (pc); -- -- return (u->HP_UX_interrupt_marker -- && !PC_IN_SIGTRAMP (pc, DEPRECATED_SYMBOL_NAME (msym_us))); --} -- --/* Called when no unwind descriptor was found for PC. Returns 1 if it -- appears that PC is in a linker stub. -+/* This function pushes a stack frame with arguments as part of the -+ inferior function calling mechanism. - -- ?!? Need to handle stubs which appear in PA64 code. */ -+ This is the version of the function for the 32-bit PA machines, in -+ which later arguments appear at lower addresses. (The stack always -+ grows towards higher addresses.) - --static int --pc_in_linker_stub (CORE_ADDR pc) -+ We simply allocate the appropriate amount of stack space and put -+ arguments into their proper slots. */ -+ -+CORE_ADDR -+hppa32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, -+ struct regcache *regcache, CORE_ADDR bp_addr, -+ int nargs, struct value **args, CORE_ADDR sp, -+ int struct_return, CORE_ADDR struct_addr) - { -- int found_magic_instruction = 0; -- int i; -- char buf[4]; -+ /* NOTE: cagney/2004-02-27: This is a guess - its implemented by -+ reverse engineering testsuite failures. */ - -- /* If unable to read memory, assume pc is not in a linker stub. */ -- if (target_read_memory (pc, buf, 4) != 0) -- return 0; -+ /* Stack base address at which any pass-by-reference parameters are -+ stored. */ -+ CORE_ADDR struct_end = 0; -+ /* Stack base address at which the first parameter is stored. */ -+ CORE_ADDR param_end = 0; - -- /* We are looking for something like -+ /* The inner most end of the stack after all the parameters have -+ been pushed. */ -+ CORE_ADDR new_sp = 0; - -- ; $$dyncall jams RP into this special spot in the frame (RP') -- ; before calling the "call stub" -- ldw -18(sp),rp -- -- ldsid (rp),r1 ; Get space associated with RP into r1 -- mtsp r1,sp ; Move it into space register 0 -- be,n 0(sr0),rp) ; back to your regularly scheduled program */ -- -- /* Maximum known linker stub size is 4 instructions. Search forward -- from the given PC, then backward. */ -- for (i = 0; i < 4; i++) -+ /* Two passes. First pass computes the location of everything, -+ second pass writes the bytes out. */ -+ int write_pass; -+ for (write_pass = 0; write_pass < 2; write_pass++) - { -- /* If we hit something with an unwind, stop searching this direction. */ -- -- if (find_unwind_entry (pc + i * 4) != 0) -- break; -+ CORE_ADDR struct_ptr = 0; -+ CORE_ADDR param_ptr = 0; -+ int reg = 27; /* NOTE: Registers go down. */ -+ int i; -+ for (i = 0; i < nargs; i++) -+ { -+ struct value *arg = args[i]; -+ struct type *type = check_typedef (VALUE_TYPE (arg)); -+ /* The corresponding parameter that is pushed onto the -+ stack, and [possibly] passed in a register. */ -+ char param_val[8]; -+ int param_len; -+ memset (param_val, 0, sizeof param_val); -+ if (TYPE_LENGTH (type) > 8) -+ { -+ /* Large parameter, pass by reference. Store the value -+ in "struct" area and then pass its address. */ -+ param_len = 4; -+ struct_ptr += align_up (TYPE_LENGTH (type), 8); -+ if (write_pass) -+ write_memory (struct_end - struct_ptr, VALUE_CONTENTS (arg), -+ TYPE_LENGTH (type)); -+ store_unsigned_integer (param_val, 4, struct_end - struct_ptr); -+ } -+ else if (TYPE_CODE (type) == TYPE_CODE_INT -+ || TYPE_CODE (type) == TYPE_CODE_ENUM) -+ { -+ /* Integer value store, right aligned. "unpack_long" -+ takes care of any sign-extension problems. */ -+ param_len = align_up (TYPE_LENGTH (type), 4); -+ store_unsigned_integer (param_val, param_len, -+ unpack_long (type, -+ VALUE_CONTENTS (arg))); -+ } -+ else -+ { -+ /* Small struct value, store right aligned? */ -+ param_len = align_up (TYPE_LENGTH (type), 4); -+ memcpy (param_val + param_len - TYPE_LENGTH (type), -+ VALUE_CONTENTS (arg), TYPE_LENGTH (type)); -+ } -+ param_ptr += param_len; -+ reg -= param_len / 4; -+ if (write_pass) -+ { -+ write_memory (param_end - param_ptr, param_val, param_len); -+ if (reg >= 23) -+ { -+ regcache_cooked_write (regcache, reg, param_val); -+ if (param_len > 4) -+ regcache_cooked_write (regcache, reg + 1, param_val + 4); -+ } -+ } -+ } - -- /* Check for ldsid (rp),r1 which is the magic instruction for a -- return from a cross-space function call. */ -- if (read_memory_integer (pc + i * 4, 4) == 0x004010a1) -+ /* Update the various stack pointers. */ -+ if (!write_pass) - { -- found_magic_instruction = 1; -- break; -+ struct_end = sp + struct_ptr; -+ /* PARAM_PTR already accounts for all the arguments passed -+ by the user. However, the ABI mandates minimum stack -+ space allocations for outgoing arguments. The ABI also -+ mandates minimum stack alignments which we must -+ preserve. */ -+ param_end = struct_end + max (align_up (param_ptr, 8), 16); - } -- /* Add code to handle long call/branch and argument relocation stubs -- here. */ - } - -- if (found_magic_instruction != 0) -- return 1; -+ /* If a structure has to be returned, set up register 28 to hold its -+ address */ -+ if (struct_return) -+ write_register (28, struct_addr); - -- /* Now look backward. */ -- for (i = 0; i < 4; i++) -- { -- /* If we hit something with an unwind, stop searching this direction. */ -+ /* Set the return address. */ -+ regcache_cooked_write_unsigned (regcache, RP_REGNUM, bp_addr); - -- if (find_unwind_entry (pc - i * 4) != 0) -- break; -+ /* Update the Stack Pointer. */ -+ regcache_cooked_write_unsigned (regcache, SP_REGNUM, param_end + 32); - -- /* Check for ldsid (rp),r1 which is the magic instruction for a -- return from a cross-space function call. */ -- if (read_memory_integer (pc - i * 4, 4) == 0x004010a1) -- { -- found_magic_instruction = 1; -- break; -- } -- /* Add code to handle long call/branch and argument relocation stubs -- here. */ -- } -- return found_magic_instruction; -+ /* The stack will have 32 bytes of additional space for a frame marker. */ -+ return param_end + 32; - } - --static int --find_return_regnum (CORE_ADDR pc) --{ -- struct unwind_table_entry *u; -- -- u = find_unwind_entry (pc); -- -- if (!u) -- return RP_REGNUM; -+/* This function pushes a stack frame with arguments as part of the -+ inferior function calling mechanism. - -- if (u->Millicode) -- return 31; -+ This is the version for the PA64, in which later arguments appear -+ at higher addresses. (The stack always grows towards higher -+ addresses.) - -- return RP_REGNUM; --} -+ We simply allocate the appropriate amount of stack space and put -+ arguments into their proper slots. - --/* Return size of frame, or -1 if we should use a frame pointer. */ --static int --find_proc_framesize (CORE_ADDR pc) -+ This ABI also requires that the caller provide an argument pointer -+ to the callee, so we do that too. */ -+ -+CORE_ADDR -+hppa64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, -+ struct regcache *regcache, CORE_ADDR bp_addr, -+ int nargs, struct value **args, CORE_ADDR sp, -+ int struct_return, CORE_ADDR struct_addr) - { -- struct unwind_table_entry *u; -- struct minimal_symbol *msym_us; -+ /* NOTE: cagney/2004-02-27: This is a guess - its implemented by -+ reverse engineering testsuite failures. */ - -- /* This may indicate a bug in our callers... */ -- if (pc == (CORE_ADDR) 0) -- return -1; -+ /* Stack base address at which any pass-by-reference parameters are -+ stored. */ -+ CORE_ADDR struct_end = 0; -+ /* Stack base address at which the first parameter is stored. */ -+ CORE_ADDR param_end = 0; - -- u = find_unwind_entry (pc); -+ /* The inner most end of the stack after all the parameters have -+ been pushed. */ -+ CORE_ADDR new_sp = 0; - -- if (!u) -+ /* Two passes. First pass computes the location of everything, -+ second pass writes the bytes out. */ -+ int write_pass; -+ for (write_pass = 0; write_pass < 2; write_pass++) - { -- if (pc_in_linker_stub (pc)) -- /* Linker stubs have a zero size frame. */ -- return 0; -- else -- return -1; -+ CORE_ADDR struct_ptr = 0; -+ CORE_ADDR param_ptr = 0; -+ int i; -+ for (i = 0; i < nargs; i++) -+ { -+ struct value *arg = args[i]; -+ struct type *type = check_typedef (VALUE_TYPE (arg)); -+ if ((TYPE_CODE (type) == TYPE_CODE_INT -+ || TYPE_CODE (type) == TYPE_CODE_ENUM) -+ && TYPE_LENGTH (type) <= 8) -+ { -+ /* Integer value store, right aligned. "unpack_long" -+ takes care of any sign-extension problems. */ -+ param_ptr += 8; -+ if (write_pass) -+ { -+ ULONGEST val = unpack_long (type, VALUE_CONTENTS (arg)); -+ int reg = 27 - param_ptr / 8; -+ write_memory_unsigned_integer (param_end - param_ptr, -+ val, 8); -+ if (reg >= 19) -+ regcache_cooked_write_unsigned (regcache, reg, val); -+ } -+ } -+ else -+ { -+ /* Small struct value, store left aligned? */ -+ int reg; -+ if (TYPE_LENGTH (type) > 8) -+ { -+ param_ptr = align_up (param_ptr, 16); -+ reg = 26 - param_ptr / 8; -+ param_ptr += align_up (TYPE_LENGTH (type), 16); -+ } -+ else -+ { -+ param_ptr = align_up (param_ptr, 8); -+ reg = 26 - param_ptr / 8; -+ param_ptr += align_up (TYPE_LENGTH (type), 8); -+ } -+ if (write_pass) -+ { -+ int byte; -+ write_memory (param_end - param_ptr, VALUE_CONTENTS (arg), -+ TYPE_LENGTH (type)); -+ for (byte = 0; byte < TYPE_LENGTH (type); byte += 8) -+ { -+ if (reg >= 19) -+ { -+ int len = min (8, TYPE_LENGTH (type) - byte); -+ regcache_cooked_write_part (regcache, reg, 0, len, -+ VALUE_CONTENTS (arg) + byte); -+ } -+ reg--; -+ } -+ } -+ } -+ } -+ /* Update the various stack pointers. */ -+ if (!write_pass) -+ { -+ struct_end = sp + struct_ptr; -+ /* PARAM_PTR already accounts for all the arguments passed -+ by the user. However, the ABI mandates minimum stack -+ space allocations for outgoing arguments. The ABI also -+ mandates minimum stack alignments which we must -+ preserve. */ -+ param_end = struct_end + max (align_up (param_ptr, 16), 64); -+ } - } - -- msym_us = lookup_minimal_symbol_by_pc (pc); -+ /* If a structure has to be returned, set up register 28 to hold its -+ address */ -+ if (struct_return) -+ write_register (28, struct_addr); - -- /* If Save_SP is set, and we're not in an interrupt or signal caller, -- then we have a frame pointer. Use it. */ -- if (u->Save_SP -- && !pc_in_interrupt_handler (pc) -- && msym_us -- && !PC_IN_SIGTRAMP (pc, DEPRECATED_SYMBOL_NAME (msym_us))) -- return -1; -+ /* Set the return address. */ -+ regcache_cooked_write_unsigned (regcache, RP_REGNUM, bp_addr); - -- return u->Total_frame_size << 3; --} -+ /* Update the Stack Pointer. */ -+ regcache_cooked_write_unsigned (regcache, SP_REGNUM, param_end + 64); - --/* Return offset from sp at which rp is saved, or 0 if not saved. */ --static int rp_saved (CORE_ADDR); -- --static int --rp_saved (CORE_ADDR pc) --{ -- struct unwind_table_entry *u; -- -- /* A function at, and thus a return PC from, address 0? Not in HP-UX! */ -- if (pc == (CORE_ADDR) 0) -- return 0; -- -- u = find_unwind_entry (pc); -- -- if (!u) -- { -- if (pc_in_linker_stub (pc)) -- /* This is the so-called RP'. */ -- return -24; -- else -- return 0; -- } -- -- if (u->Save_RP) -- return (TARGET_PTR_BIT == 64 ? -16 : -20); -- else if (u->stub_unwind.stub_type != 0) -- { -- switch (u->stub_unwind.stub_type) -- { -- case EXPORT: -- case IMPORT: -- return -24; -- case PARAMETER_RELOCATION: -- return -8; -- default: -- return 0; -- } -- } -- else -- return 0; --} -- --int --hppa_frameless_function_invocation (struct frame_info *frame) --{ -- struct unwind_table_entry *u; -- -- u = find_unwind_entry (get_frame_pc (frame)); -- -- if (u == 0) -- return 0; -- -- return (u->Total_frame_size == 0 && u->stub_unwind.stub_type == 0); --} -- --/* Immediately after a function call, return the saved pc. -- Can't go through the frames for this because on some machines -- the new frame is not set up until the new function executes -- some instructions. */ -- --CORE_ADDR --hppa_saved_pc_after_call (struct frame_info *frame) --{ -- int ret_regnum; -- CORE_ADDR pc; -- struct unwind_table_entry *u; -- -- ret_regnum = find_return_regnum (get_frame_pc (frame)); -- pc = read_register (ret_regnum) & ~0x3; -- -- /* If PC is in a linker stub, then we need to dig the address -- the stub will return to out of the stack. */ -- u = find_unwind_entry (pc); -- if (u && u->stub_unwind.stub_type != 0) -- return DEPRECATED_FRAME_SAVED_PC (frame); -- else -- return pc; --} -- --CORE_ADDR --hppa_frame_saved_pc (struct frame_info *frame) --{ -- CORE_ADDR pc = get_frame_pc (frame); -- struct unwind_table_entry *u; -- CORE_ADDR old_pc = 0; -- int spun_around_loop = 0; -- int rp_offset = 0; -- -- /* BSD, HPUX & OSF1 all lay out the hardware state in the same manner -- at the base of the frame in an interrupt handler. Registers within -- are saved in the exact same order as GDB numbers registers. How -- convienent. */ -- if (pc_in_interrupt_handler (pc)) -- return read_memory_integer (get_frame_base (frame) + PC_REGNUM * 4, -- TARGET_PTR_BIT / 8) & ~0x3; -- -- if ((get_frame_pc (frame) >= get_frame_base (frame) -- && (get_frame_pc (frame) -- <= (get_frame_base (frame) -- /* A call dummy is sized in words, but it is actually a -- series of instructions. Account for that scaling -- factor. */ -- + ((DEPRECATED_REGISTER_SIZE / INSTRUCTION_SIZE) -- * DEPRECATED_CALL_DUMMY_LENGTH) -- /* Similarly we have to account for 64bit wide register -- saves. */ -- + (32 * DEPRECATED_REGISTER_SIZE) -- /* We always consider FP regs 8 bytes long. */ -- + (NUM_REGS - FP0_REGNUM) * 8 -- /* Similarly we have to account for 64bit wide register -- saves. */ -- + (6 * DEPRECATED_REGISTER_SIZE))))) -- { -- return read_memory_integer ((get_frame_base (frame) -- + (TARGET_PTR_BIT == 64 ? -16 : -20)), -- TARGET_PTR_BIT / 8) & ~0x3; -- } -- --#ifdef FRAME_SAVED_PC_IN_SIGTRAMP -- /* Deal with signal handler caller frames too. */ -- if ((get_frame_type (frame) == SIGTRAMP_FRAME)) -- { -- CORE_ADDR rp; -- FRAME_SAVED_PC_IN_SIGTRAMP (frame, &rp); -- return rp & ~0x3; -- } --#endif -- -- if (hppa_frameless_function_invocation (frame)) -- { -- int ret_regnum; -- -- ret_regnum = find_return_regnum (pc); -- -- /* If the next frame is an interrupt frame or a signal -- handler caller, then we need to look in the saved -- register area to get the return pointer (the values -- in the registers may not correspond to anything useful). */ -- if (get_next_frame (frame) -- && ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) -- || pc_in_interrupt_handler (get_frame_pc (get_next_frame (frame))))) -- { -- CORE_ADDR *saved_regs; -- hppa_frame_init_saved_regs (get_next_frame (frame)); -- saved_regs = deprecated_get_frame_saved_regs (get_next_frame (frame)); -- if (read_memory_integer (saved_regs[FLAGS_REGNUM], -- TARGET_PTR_BIT / 8) & 0x2) -- { -- pc = read_memory_integer (saved_regs[31], -- TARGET_PTR_BIT / 8) & ~0x3; -- -- /* Syscalls are really two frames. The syscall stub itself -- with a return pointer in %rp and the kernel call with -- a return pointer in %r31. We return the %rp variant -- if %r31 is the same as frame->pc. */ -- if (pc == get_frame_pc (frame)) -- pc = read_memory_integer (saved_regs[RP_REGNUM], -- TARGET_PTR_BIT / 8) & ~0x3; -- } -- else -- pc = read_memory_integer (saved_regs[RP_REGNUM], -- TARGET_PTR_BIT / 8) & ~0x3; -- } -- else -- pc = read_register (ret_regnum) & ~0x3; -- } -- else -- { -- spun_around_loop = 0; -- old_pc = pc; -- -- restart: -- rp_offset = rp_saved (pc); -- -- /* Similar to code in frameless function case. If the next -- frame is a signal or interrupt handler, then dig the right -- information out of the saved register info. */ -- if (rp_offset == 0 -- && get_next_frame (frame) -- && ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) -- || pc_in_interrupt_handler (get_frame_pc (get_next_frame (frame))))) -- { -- CORE_ADDR *saved_regs; -- hppa_frame_init_saved_regs (get_next_frame (frame)); -- saved_regs = deprecated_get_frame_saved_regs (get_next_frame (frame)); -- if (read_memory_integer (saved_regs[FLAGS_REGNUM], -- TARGET_PTR_BIT / 8) & 0x2) -- { -- pc = read_memory_integer (saved_regs[31], -- TARGET_PTR_BIT / 8) & ~0x3; -- -- /* Syscalls are really two frames. The syscall stub itself -- with a return pointer in %rp and the kernel call with -- a return pointer in %r31. We return the %rp variant -- if %r31 is the same as frame->pc. */ -- if (pc == get_frame_pc (frame)) -- pc = read_memory_integer (saved_regs[RP_REGNUM], -- TARGET_PTR_BIT / 8) & ~0x3; -- } -- else -- pc = read_memory_integer (saved_regs[RP_REGNUM], -- TARGET_PTR_BIT / 8) & ~0x3; -- } -- else if (rp_offset == 0) -- { -- old_pc = pc; -- pc = read_register (RP_REGNUM) & ~0x3; -- } -- else -- { -- old_pc = pc; -- pc = read_memory_integer (get_frame_base (frame) + rp_offset, -- TARGET_PTR_BIT / 8) & ~0x3; -- } -- } -- -- /* If PC is inside a linker stub, then dig out the address the stub -- will return to. -- -- Don't do this for long branch stubs. Why? For some unknown reason -- _start is marked as a long branch stub in hpux10. */ -- u = find_unwind_entry (pc); -- if (u && u->stub_unwind.stub_type != 0 -- && u->stub_unwind.stub_type != LONG_BRANCH) -- { -- unsigned int insn; -- -- /* If this is a dynamic executable, and we're in a signal handler, -- then the call chain will eventually point us into the stub for -- _sigreturn. Unlike most cases, we'll be pointed to the branch -- to the real sigreturn rather than the code after the real branch!. -- -- Else, try to dig the address the stub will return to in the normal -- fashion. */ -- insn = read_memory_integer (pc, 4); -- if ((insn & 0xfc00e000) == 0xe8000000) -- return (pc + extract_17 (insn) + 8) & ~0x3; -- else -- { -- if (old_pc == pc) -- spun_around_loop++; -- -- if (spun_around_loop > 1) -- { -- /* We're just about to go around the loop again with -- no more hope of success. Die. */ -- error ("Unable to find return pc for this frame"); -- } -- else -- goto restart; -- } -- } -- -- return pc; --} -- --/* We need to correct the PC and the FP for the outermost frame when we are -- in a system call. */ -- --void --hppa_init_extra_frame_info (int fromleaf, struct frame_info *frame) --{ -- int flags; -- int framesize; -- -- if (get_next_frame (frame) && !fromleaf) -- return; -- -- /* If the next frame represents a frameless function invocation then -- we have to do some adjustments that are normally done by -- DEPRECATED_FRAME_CHAIN. (DEPRECATED_FRAME_CHAIN is not called in -- this case.) */ -- if (fromleaf) -- { -- /* Find the framesize of *this* frame without peeking at the PC -- in the current frame structure (it isn't set yet). */ -- framesize = find_proc_framesize (DEPRECATED_FRAME_SAVED_PC (get_next_frame (frame))); -- -- /* Now adjust our base frame accordingly. If we have a frame pointer -- use it, else subtract the size of this frame from the current -- frame. (we always want frame->frame to point at the lowest address -- in the frame). */ -- if (framesize == -1) -- deprecated_update_frame_base_hack (frame, deprecated_read_fp ()); -- else -- deprecated_update_frame_base_hack (frame, get_frame_base (frame) - framesize); -- return; -- } -- -- flags = read_register (FLAGS_REGNUM); -- if (flags & 2) /* In system call? */ -- deprecated_update_frame_pc_hack (frame, read_register (31) & ~0x3); -- -- /* The outermost frame is always derived from PC-framesize -- -- One might think frameless innermost frames should have -- a frame->frame that is the same as the parent's frame->frame. -- That is wrong; frame->frame in that case should be the *high* -- address of the parent's frame. It's complicated as hell to -- explain, but the parent *always* creates some stack space for -- the child. So the child actually does have a frame of some -- sorts, and its base is the high address in its parent's frame. */ -- framesize = find_proc_framesize (get_frame_pc (frame)); -- if (framesize == -1) -- deprecated_update_frame_base_hack (frame, deprecated_read_fp ()); -- else -- deprecated_update_frame_base_hack (frame, read_register (SP_REGNUM) - framesize); --} -- --/* Given a GDB frame, determine the address of the calling function's -- frame. This will be used to create a new GDB frame struct, and -- then DEPRECATED_INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC -- will be called for the new frame. -- -- This may involve searching through prologues for several functions -- at boundaries where GCC calls HP C code, or where code which has -- a frame pointer calls code without a frame pointer. */ -- --CORE_ADDR --hppa_frame_chain (struct frame_info *frame) --{ -- int my_framesize, caller_framesize; -- struct unwind_table_entry *u; -- CORE_ADDR frame_base; -- struct frame_info *tmp_frame; -- -- /* A frame in the current frame list, or zero. */ -- struct frame_info *saved_regs_frame = 0; -- /* Where the registers were saved in saved_regs_frame. If -- saved_regs_frame is zero, this is garbage. */ -- CORE_ADDR *saved_regs = NULL; -- -- CORE_ADDR caller_pc; -- -- struct minimal_symbol *min_frame_symbol; -- struct symbol *frame_symbol; -- char *frame_symbol_name; -- -- /* If this is a threaded application, and we see the -- routine "__pthread_exit", treat it as the stack root -- for this thread. */ -- min_frame_symbol = lookup_minimal_symbol_by_pc (get_frame_pc (frame)); -- frame_symbol = find_pc_function (get_frame_pc (frame)); -- -- if ((min_frame_symbol != 0) /* && (frame_symbol == 0) */ ) -- { -- /* The test above for "no user function name" would defend -- against the slim likelihood that a user might define a -- routine named "__pthread_exit" and then try to debug it. -- -- If it weren't commented out, and you tried to debug the -- pthread library itself, you'd get errors. -- -- So for today, we don't make that check. */ -- frame_symbol_name = DEPRECATED_SYMBOL_NAME (min_frame_symbol); -- if (frame_symbol_name != 0) -- { -- if (0 == strncmp (frame_symbol_name, -- THREAD_INITIAL_FRAME_SYMBOL, -- THREAD_INITIAL_FRAME_SYM_LEN)) -- { -- /* Pretend we've reached the bottom of the stack. */ -- return (CORE_ADDR) 0; -- } -- } -- } /* End of hacky code for threads. */ -- -- /* Handle HPUX, BSD, and OSF1 style interrupt frames first. These -- are easy; at *sp we have a full save state strucutre which we can -- pull the old stack pointer from. Also see frame_saved_pc for -- code to dig a saved PC out of the save state structure. */ -- if (pc_in_interrupt_handler (get_frame_pc (frame))) -- frame_base = read_memory_integer (get_frame_base (frame) + SP_REGNUM * 4, -- TARGET_PTR_BIT / 8); --#ifdef FRAME_BASE_BEFORE_SIGTRAMP -- else if ((get_frame_type (frame) == SIGTRAMP_FRAME)) -- { -- FRAME_BASE_BEFORE_SIGTRAMP (frame, &frame_base); -- } --#endif -- else -- frame_base = get_frame_base (frame); -- -- /* Get frame sizes for the current frame and the frame of the -- caller. */ -- my_framesize = find_proc_framesize (get_frame_pc (frame)); -- caller_pc = DEPRECATED_FRAME_SAVED_PC (frame); -- -- /* If we can't determine the caller's PC, then it's not likely we can -- really determine anything meaningful about its frame. We'll consider -- this to be stack bottom. */ -- if (caller_pc == (CORE_ADDR) 0) -- return (CORE_ADDR) 0; -- -- caller_framesize = find_proc_framesize (DEPRECATED_FRAME_SAVED_PC (frame)); -- -- /* If caller does not have a frame pointer, then its frame -- can be found at current_frame - caller_framesize. */ -- if (caller_framesize != -1) -- { -- return frame_base - caller_framesize; -- } -- /* Both caller and callee have frame pointers and are GCC compiled -- (SAVE_SP bit in unwind descriptor is on for both functions. -- The previous frame pointer is found at the top of the current frame. */ -- if (caller_framesize == -1 && my_framesize == -1) -- { -- return read_memory_integer (frame_base, TARGET_PTR_BIT / 8); -- } -- /* Caller has a frame pointer, but callee does not. This is a little -- more difficult as GCC and HP C lay out locals and callee register save -- areas very differently. -- -- The previous frame pointer could be in a register, or in one of -- several areas on the stack. -- -- Walk from the current frame to the innermost frame examining -- unwind descriptors to determine if %r3 ever gets saved into the -- stack. If so return whatever value got saved into the stack. -- If it was never saved in the stack, then the value in %r3 is still -- valid, so use it. -- -- We use information from unwind descriptors to determine if %r3 -- is saved into the stack (Entry_GR field has this information). */ -- -- for (tmp_frame = frame; tmp_frame; tmp_frame = get_next_frame (tmp_frame)) -- { -- u = find_unwind_entry (get_frame_pc (tmp_frame)); -- -- if (!u) -- { -- /* We could find this information by examining prologues. I don't -- think anyone has actually written any tools (not even "strip") -- which leave them out of an executable, so maybe this is a moot -- point. */ -- /* ??rehrauer: Actually, it's quite possible to stepi your way into -- code that doesn't have unwind entries. For example, stepping into -- the dynamic linker will give you a PC that has none. Thus, I've -- disabled this warning. */ --#if 0 -- warning ("Unable to find unwind for PC 0x%x -- Help!", get_frame_pc (tmp_frame)); --#endif -- return (CORE_ADDR) 0; -- } -- -- if (u->Save_SP -- || (get_frame_type (tmp_frame) == SIGTRAMP_FRAME) -- || pc_in_interrupt_handler (get_frame_pc (tmp_frame))) -- break; -- -- /* Entry_GR specifies the number of callee-saved general registers -- saved in the stack. It starts at %r3, so %r3 would be 1. */ -- if (u->Entry_GR >= 1) -- { -- /* The unwind entry claims that r3 is saved here. However, -- in optimized code, GCC often doesn't actually save r3. -- We'll discover this if we look at the prologue. */ -- hppa_frame_init_saved_regs (tmp_frame); -- saved_regs = deprecated_get_frame_saved_regs (tmp_frame); -- saved_regs_frame = tmp_frame; -- -- /* If we have an address for r3, that's good. */ -- if (saved_regs[DEPRECATED_FP_REGNUM]) -- break; -- } -- } -- -- if (tmp_frame) -- { -- /* We may have walked down the chain into a function with a frame -- pointer. */ -- if (u->Save_SP -- && !(get_frame_type (tmp_frame) == SIGTRAMP_FRAME) -- && !pc_in_interrupt_handler (get_frame_pc (tmp_frame))) -- { -- return read_memory_integer (get_frame_base (tmp_frame), TARGET_PTR_BIT / 8); -- } -- /* %r3 was saved somewhere in the stack. Dig it out. */ -- else -- { -- /* Sick. -- -- For optimization purposes many kernels don't have the -- callee saved registers into the save_state structure upon -- entry into the kernel for a syscall; the optimization -- is usually turned off if the process is being traced so -- that the debugger can get full register state for the -- process. -- -- This scheme works well except for two cases: -- -- * Attaching to a process when the process is in the -- kernel performing a system call (debugger can't get -- full register state for the inferior process since -- the process wasn't being traced when it entered the -- system call). -- -- * Register state is not complete if the system call -- causes the process to core dump. -- -- -- The following heinous code is an attempt to deal with -- the lack of register state in a core dump. It will -- fail miserably if the function which performs the -- system call has a variable sized stack frame. */ -- -- if (tmp_frame != saved_regs_frame) -- { -- hppa_frame_init_saved_regs (tmp_frame); -- saved_regs = deprecated_get_frame_saved_regs (tmp_frame); -- } -- -- /* Abominable hack. */ -- if (current_target.to_has_execution == 0 -- && ((saved_regs[FLAGS_REGNUM] -- && (read_memory_integer (saved_regs[FLAGS_REGNUM], -- TARGET_PTR_BIT / 8) -- & 0x2)) -- || (saved_regs[FLAGS_REGNUM] == 0 -- && read_register (FLAGS_REGNUM) & 0x2))) -- { -- u = find_unwind_entry (DEPRECATED_FRAME_SAVED_PC (frame)); -- if (!u) -- { -- return read_memory_integer (saved_regs[DEPRECATED_FP_REGNUM], -- TARGET_PTR_BIT / 8); -- } -- else -- { -- return frame_base - (u->Total_frame_size << 3); -- } -- } -- -- return read_memory_integer (saved_regs[DEPRECATED_FP_REGNUM], -- TARGET_PTR_BIT / 8); -- } -- } -- else -- { -- /* Get the innermost frame. */ -- tmp_frame = frame; -- while (get_next_frame (tmp_frame) != NULL) -- tmp_frame = get_next_frame (tmp_frame); -- -- if (tmp_frame != saved_regs_frame) -- { -- hppa_frame_init_saved_regs (tmp_frame); -- saved_regs = deprecated_get_frame_saved_regs (tmp_frame); -- } -- -- /* Abominable hack. See above. */ -- if (current_target.to_has_execution == 0 -- && ((saved_regs[FLAGS_REGNUM] -- && (read_memory_integer (saved_regs[FLAGS_REGNUM], -- TARGET_PTR_BIT / 8) -- & 0x2)) -- || (saved_regs[FLAGS_REGNUM] == 0 -- && read_register (FLAGS_REGNUM) & 0x2))) -- { -- u = find_unwind_entry (DEPRECATED_FRAME_SAVED_PC (frame)); -- if (!u) -- { -- return read_memory_integer (saved_regs[DEPRECATED_FP_REGNUM], -- TARGET_PTR_BIT / 8); -- } -- else -- { -- return frame_base - (u->Total_frame_size << 3); -- } -- } -- -- /* The value in %r3 was never saved into the stack (thus %r3 still -- holds the value of the previous frame pointer). */ -- return deprecated_read_fp (); -- } --} -- -- --/* To see if a frame chain is valid, see if the caller looks like it -- was compiled with gcc. */ -- --int --hppa_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe) --{ -- struct minimal_symbol *msym_us; -- struct minimal_symbol *msym_start; -- struct unwind_table_entry *u, *next_u = NULL; -- struct frame_info *next; -- -- u = find_unwind_entry (get_frame_pc (thisframe)); -- -- if (u == NULL) -- return 1; -- -- /* We can't just check that the same of msym_us is "_start", because -- someone idiotically decided that they were going to make a Ltext_end -- symbol with the same address. This Ltext_end symbol is totally -- indistinguishable (as nearly as I can tell) from the symbol for a function -- which is (legitimately, since it is in the user's namespace) -- named Ltext_end, so we can't just ignore it. */ -- msym_us = lookup_minimal_symbol_by_pc (DEPRECATED_FRAME_SAVED_PC (thisframe)); -- msym_start = lookup_minimal_symbol ("_start", NULL, NULL); -- if (msym_us -- && msym_start -- && SYMBOL_VALUE_ADDRESS (msym_us) == SYMBOL_VALUE_ADDRESS (msym_start)) -- return 0; -- -- /* Grrrr. Some new idiot decided that they don't want _start for the -- PRO configurations; $START$ calls main directly.... Deal with it. */ -- msym_start = lookup_minimal_symbol ("$START$", NULL, NULL); -- if (msym_us -- && msym_start -- && SYMBOL_VALUE_ADDRESS (msym_us) == SYMBOL_VALUE_ADDRESS (msym_start)) -- return 0; -- -- next = get_next_frame (thisframe); -- if (next) -- next_u = find_unwind_entry (get_frame_pc (next)); -- -- /* If this frame does not save SP, has no stack, isn't a stub, -- and doesn't "call" an interrupt routine or signal handler caller, -- then its not valid. */ -- if (u->Save_SP || u->Total_frame_size || u->stub_unwind.stub_type != 0 -- || (get_next_frame (thisframe) && (get_frame_type (get_next_frame (thisframe)) == SIGTRAMP_FRAME)) -- || (next_u && next_u->HP_UX_interrupt_marker)) -- return 1; -- -- if (pc_in_linker_stub (get_frame_pc (thisframe))) -- return 1; -- -- return 0; --} -- --/* These functions deal with saving and restoring register state -- around a function call in the inferior. They keep the stack -- double-word aligned; eventually, on an hp700, the stack will have -- to be aligned to a 64-byte boundary. */ -- --void --hppa_push_dummy_frame (void) --{ -- CORE_ADDR sp, pc, pcspace; -- int regnum; -- CORE_ADDR int_buffer; -- double freg_buffer; -- -- pc = hppa_target_read_pc (inferior_ptid); -- int_buffer = read_register (FLAGS_REGNUM); -- if (int_buffer & 0x2) -- { -- const unsigned int sid = (pc >> 30) & 0x3; -- if (sid == 0) -- pcspace = read_register (SR4_REGNUM); -- else -- pcspace = read_register (SR4_REGNUM + 4 + sid); -- } -- else -- pcspace = read_register (PCSQ_HEAD_REGNUM); -- -- /* Space for "arguments"; the RP goes in here. */ -- sp = read_register (SP_REGNUM) + 48; -- int_buffer = read_register (RP_REGNUM) | 0x3; -- -- /* The 32bit and 64bit ABIs save the return pointer into different -- stack slots. */ -- if (DEPRECATED_REGISTER_SIZE == 8) -- write_memory (sp - 16, (char *) &int_buffer, DEPRECATED_REGISTER_SIZE); -- else -- write_memory (sp - 20, (char *) &int_buffer, DEPRECATED_REGISTER_SIZE); -- -- int_buffer = deprecated_read_fp (); -- write_memory (sp, (char *) &int_buffer, DEPRECATED_REGISTER_SIZE); -- -- write_register (DEPRECATED_FP_REGNUM, sp); -- -- sp += 2 * DEPRECATED_REGISTER_SIZE; -- -- for (regnum = 1; regnum < 32; regnum++) -- if (regnum != RP_REGNUM && regnum != DEPRECATED_FP_REGNUM) -- sp = push_word (sp, read_register (regnum)); -- -- /* This is not necessary for the 64bit ABI. In fact it is dangerous. */ -- if (DEPRECATED_REGISTER_SIZE != 8) -- sp += 4; -- -- for (regnum = FP0_REGNUM; regnum < NUM_REGS; regnum++) -- { -- deprecated_read_register_bytes (DEPRECATED_REGISTER_BYTE (regnum), -- (char *) &freg_buffer, 8); -- sp = push_bytes (sp, (char *) &freg_buffer, 8); -- } -- sp = push_word (sp, read_register (IPSW_REGNUM)); -- sp = push_word (sp, read_register (SAR_REGNUM)); -- sp = push_word (sp, pc); -- sp = push_word (sp, pcspace); -- sp = push_word (sp, pc + 4); -- sp = push_word (sp, pcspace); -- write_register (SP_REGNUM, sp); --} -- --static void --find_dummy_frame_regs (struct frame_info *frame, -- CORE_ADDR frame_saved_regs[]) --{ -- CORE_ADDR fp = get_frame_base (frame); -- int i; -- -- /* The 32bit and 64bit ABIs save RP into different locations. */ -- if (DEPRECATED_REGISTER_SIZE == 8) -- frame_saved_regs[RP_REGNUM] = (fp - 16) & ~0x3; -- else -- frame_saved_regs[RP_REGNUM] = (fp - 20) & ~0x3; -- -- frame_saved_regs[DEPRECATED_FP_REGNUM] = fp; -- -- frame_saved_regs[1] = fp + (2 * DEPRECATED_REGISTER_SIZE); -- -- for (fp += 3 * DEPRECATED_REGISTER_SIZE, i = 3; i < 32; i++) -- { -- if (i != DEPRECATED_FP_REGNUM) -- { -- frame_saved_regs[i] = fp; -- fp += DEPRECATED_REGISTER_SIZE; -- } -- } -- -- /* This is not necessary or desirable for the 64bit ABI. */ -- if (DEPRECATED_REGISTER_SIZE != 8) -- fp += 4; -- -- for (i = FP0_REGNUM; i < NUM_REGS; i++, fp += 8) -- frame_saved_regs[i] = fp; -- -- frame_saved_regs[IPSW_REGNUM] = fp; -- frame_saved_regs[SAR_REGNUM] = fp + DEPRECATED_REGISTER_SIZE; -- frame_saved_regs[PCOQ_HEAD_REGNUM] = fp + 2 * DEPRECATED_REGISTER_SIZE; -- frame_saved_regs[PCSQ_HEAD_REGNUM] = fp + 3 * DEPRECATED_REGISTER_SIZE; -- frame_saved_regs[PCOQ_TAIL_REGNUM] = fp + 4 * DEPRECATED_REGISTER_SIZE; -- frame_saved_regs[PCSQ_TAIL_REGNUM] = fp + 5 * DEPRECATED_REGISTER_SIZE; --} -- --void --hppa_pop_frame (void) --{ -- struct frame_info *frame = get_current_frame (); -- CORE_ADDR fp, npc, target_pc; -- int regnum; -- CORE_ADDR *fsr; -- double freg_buffer; -- -- fp = get_frame_base (frame); -- hppa_frame_init_saved_regs (frame); -- fsr = deprecated_get_frame_saved_regs (frame); -- --#ifndef NO_PC_SPACE_QUEUE_RESTORE -- if (fsr[IPSW_REGNUM]) /* Restoring a call dummy frame */ -- restore_pc_queue (fsr); --#endif -- -- for (regnum = 31; regnum > 0; regnum--) -- if (fsr[regnum]) -- write_register (regnum, read_memory_integer (fsr[regnum], -- DEPRECATED_REGISTER_SIZE)); -- -- for (regnum = NUM_REGS - 1; regnum >= FP0_REGNUM; regnum--) -- if (fsr[regnum]) -- { -- read_memory (fsr[regnum], (char *) &freg_buffer, 8); -- deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (regnum), -- (char *) &freg_buffer, 8); -- } -- -- if (fsr[IPSW_REGNUM]) -- write_register (IPSW_REGNUM, -- read_memory_integer (fsr[IPSW_REGNUM], -- DEPRECATED_REGISTER_SIZE)); -- -- if (fsr[SAR_REGNUM]) -- write_register (SAR_REGNUM, -- read_memory_integer (fsr[SAR_REGNUM], -- DEPRECATED_REGISTER_SIZE)); -- -- /* If the PC was explicitly saved, then just restore it. */ -- if (fsr[PCOQ_TAIL_REGNUM]) -- { -- npc = read_memory_integer (fsr[PCOQ_TAIL_REGNUM], -- DEPRECATED_REGISTER_SIZE); -- write_register (PCOQ_TAIL_REGNUM, npc); -- } -- /* Else use the value in %rp to set the new PC. */ -- else -- { -- npc = read_register (RP_REGNUM); -- write_pc (npc); -- } -- -- write_register (DEPRECATED_FP_REGNUM, read_memory_integer (fp, DEPRECATED_REGISTER_SIZE)); -- -- if (fsr[IPSW_REGNUM]) /* call dummy */ -- write_register (SP_REGNUM, fp - 48); -- else -- write_register (SP_REGNUM, fp); -- -- /* The PC we just restored may be inside a return trampoline. If so -- we want to restart the inferior and run it through the trampoline. -- -- Do this by setting a momentary breakpoint at the location the -- trampoline returns to. -- -- Don't skip through the trampoline if we're popping a dummy frame. */ -- target_pc = SKIP_TRAMPOLINE_CODE (npc & ~0x3) & ~0x3; -- if (target_pc && !fsr[IPSW_REGNUM]) -- { -- struct symtab_and_line sal; -- struct breakpoint *breakpoint; -- struct cleanup *old_chain; -- -- /* Set up our breakpoint. Set it to be silent as the MI code -- for "return_command" will print the frame we returned to. */ -- sal = find_pc_line (target_pc, 0); -- sal.pc = target_pc; -- breakpoint = set_momentary_breakpoint (sal, null_frame_id, bp_finish); -- breakpoint->silent = 1; -- -- /* So we can clean things up. */ -- old_chain = make_cleanup_delete_breakpoint (breakpoint); -- -- /* Start up the inferior. */ -- clear_proceed_status (); -- proceed_to_finish = 1; -- proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); -- -- /* Perform our cleanups. */ -- do_cleanups (old_chain); -- } -- flush_cached_frames (); --} -- --/* After returning to a dummy on the stack, restore the instruction -- queue space registers. */ -- --static int --restore_pc_queue (CORE_ADDR *fsr) --{ -- CORE_ADDR pc = read_pc (); -- CORE_ADDR new_pc = read_memory_integer (fsr[PCOQ_HEAD_REGNUM], -- TARGET_PTR_BIT / 8); -- struct target_waitstatus w; -- int insn_count; -- -- /* Advance past break instruction in the call dummy. */ -- write_register (PCOQ_HEAD_REGNUM, pc + 4); -- write_register (PCOQ_TAIL_REGNUM, pc + 8); -- -- /* HPUX doesn't let us set the space registers or the space -- registers of the PC queue through ptrace. Boo, hiss. -- Conveniently, the call dummy has this sequence of instructions -- after the break: -- mtsp r21, sr0 -- ble,n 0(sr0, r22) -- -- So, load up the registers and single step until we are in the -- right place. */ -- -- write_register (21, read_memory_integer (fsr[PCSQ_HEAD_REGNUM], -- DEPRECATED_REGISTER_SIZE)); -- write_register (22, new_pc); -- -- for (insn_count = 0; insn_count < 3; insn_count++) -- { -- /* FIXME: What if the inferior gets a signal right now? Want to -- merge this into wait_for_inferior (as a special kind of -- watchpoint? By setting a breakpoint at the end? Is there -- any other choice? Is there *any* way to do this stuff with -- ptrace() or some equivalent?). */ -- resume (1, 0); -- target_wait (inferior_ptid, &w); -- -- if (w.kind == TARGET_WAITKIND_SIGNALLED) -- { -- stop_signal = w.value.sig; -- terminal_ours_for_output (); -- printf_unfiltered ("\nProgram terminated with signal %s, %s.\n", -- target_signal_to_name (stop_signal), -- target_signal_to_string (stop_signal)); -- gdb_flush (gdb_stdout); -- return 0; -- } -- } -- target_terminal_ours (); -- target_fetch_registers (-1); -- return 1; --} -- -- --#ifdef PA20W_CALLING_CONVENTIONS -- --/* This function pushes a stack frame with arguments as part of the -- inferior function calling mechanism. -- -- This is the version for the PA64, in which later arguments appear -- at higher addresses. (The stack always grows towards higher -- addresses.) -- -- We simply allocate the appropriate amount of stack space and put -- arguments into their proper slots. The call dummy code will copy -- arguments into registers as needed by the ABI. -- -- This ABI also requires that the caller provide an argument pointer -- to the callee, so we do that too. */ -- --CORE_ADDR --hppa_push_arguments (int nargs, struct value **args, CORE_ADDR sp, -- int struct_return, CORE_ADDR struct_addr) --{ -- /* array of arguments' offsets */ -- int *offset = (int *) alloca (nargs * sizeof (int)); -- -- /* array of arguments' lengths: real lengths in bytes, not aligned to -- word size */ -- int *lengths = (int *) alloca (nargs * sizeof (int)); -- -- /* The value of SP as it was passed into this function after -- aligning. */ -- CORE_ADDR orig_sp = DEPRECATED_STACK_ALIGN (sp); -- -- /* The number of stack bytes occupied by the current argument. */ -- int bytes_reserved; -- -- /* The total number of bytes reserved for the arguments. */ -- int cum_bytes_reserved = 0; -- -- /* Similarly, but aligned. */ -- int cum_bytes_aligned = 0; -- int i; -- -- /* Iterate over each argument provided by the user. */ -- for (i = 0; i < nargs; i++) -- { -- struct type *arg_type = VALUE_TYPE (args[i]); -- -- /* Integral scalar values smaller than a register are padded on -- the left. We do this by promoting them to full-width, -- although the ABI says to pad them with garbage. */ -- if (is_integral_type (arg_type) -- && TYPE_LENGTH (arg_type) < DEPRECATED_REGISTER_SIZE) -- { -- args[i] = value_cast ((TYPE_UNSIGNED (arg_type) -- ? builtin_type_unsigned_long -- : builtin_type_long), -- args[i]); -- arg_type = VALUE_TYPE (args[i]); -- } -- -- lengths[i] = TYPE_LENGTH (arg_type); -- -- /* Align the size of the argument to the word size for this -- target. */ -- bytes_reserved = (lengths[i] + DEPRECATED_REGISTER_SIZE - 1) & -DEPRECATED_REGISTER_SIZE; -- -- offset[i] = cum_bytes_reserved; -- -- /* Aggregates larger than eight bytes (the only types larger -- than eight bytes we have) are aligned on a 16-byte boundary, -- possibly padded on the right with garbage. This may leave an -- empty word on the stack, and thus an unused register, as per -- the ABI. */ -- if (bytes_reserved > 8) -- { -- /* Round up the offset to a multiple of two slots. */ -- int new_offset = ((offset[i] + 2*DEPRECATED_REGISTER_SIZE-1) -- & -(2*DEPRECATED_REGISTER_SIZE)); -- -- /* Note the space we've wasted, if any. */ -- bytes_reserved += new_offset - offset[i]; -- offset[i] = new_offset; -- } -- -- cum_bytes_reserved += bytes_reserved; -- } -- -- /* CUM_BYTES_RESERVED already accounts for all the arguments -- passed by the user. However, the ABIs mandate minimum stack space -- allocations for outgoing arguments. -- -- The ABIs also mandate minimum stack alignments which we must -- preserve. */ -- cum_bytes_aligned = DEPRECATED_STACK_ALIGN (cum_bytes_reserved); -- sp += max (cum_bytes_aligned, REG_PARM_STACK_SPACE); -- -- /* Now write each of the args at the proper offset down the stack. */ -- for (i = 0; i < nargs; i++) -- write_memory (orig_sp + offset[i], VALUE_CONTENTS (args[i]), lengths[i]); -- -- /* If a structure has to be returned, set up register 28 to hold its -- address */ -- if (struct_return) -- write_register (28, struct_addr); -- -- /* For the PA64 we must pass a pointer to the outgoing argument list. -- The ABI mandates that the pointer should point to the first byte of -- storage beyond the register flushback area. -- -- However, the call dummy expects the outgoing argument pointer to -- be passed in register %r4. */ -- write_register (4, orig_sp + REG_PARM_STACK_SPACE); -- -- /* ?!? This needs further work. We need to set up the global data -- pointer for this procedure. This assumes the same global pointer -- for every procedure. The call dummy expects the dp value to -- be passed in register %r6. */ -- write_register (6, read_register (27)); -- -- /* The stack will have 64 bytes of additional space for a frame marker. */ -- return sp + 64; --} -- --#else -- --/* This function pushes a stack frame with arguments as part of the -- inferior function calling mechanism. -- -- This is the version of the function for the 32-bit PA machines, in -- which later arguments appear at lower addresses. (The stack always -- grows towards higher addresses.) -- -- We simply allocate the appropriate amount of stack space and put -- arguments into their proper slots. The call dummy code will copy -- arguments into registers as needed by the ABI. */ -- --CORE_ADDR --hppa_push_arguments (int nargs, struct value **args, CORE_ADDR sp, -- int struct_return, CORE_ADDR struct_addr) --{ -- /* array of arguments' offsets */ -- int *offset = (int *) alloca (nargs * sizeof (int)); -- -- /* array of arguments' lengths: real lengths in bytes, not aligned to -- word size */ -- int *lengths = (int *) alloca (nargs * sizeof (int)); -- -- /* The number of stack bytes occupied by the current argument. */ -- int bytes_reserved; -- -- /* The total number of bytes reserved for the arguments. */ -- int cum_bytes_reserved = 0; -- -- /* Similarly, but aligned. */ -- int cum_bytes_aligned = 0; -- int i; -- -- /* Iterate over each argument provided by the user. */ -- for (i = 0; i < nargs; i++) -- { -- lengths[i] = TYPE_LENGTH (VALUE_TYPE (args[i])); -- -- /* Align the size of the argument to the word size for this -- target. */ -- bytes_reserved = (lengths[i] + DEPRECATED_REGISTER_SIZE - 1) & -DEPRECATED_REGISTER_SIZE; -- -- offset[i] = (cum_bytes_reserved -- + (lengths[i] > 4 ? bytes_reserved : lengths[i])); -- -- /* If the argument is a double word argument, then it needs to be -- double word aligned. */ -- if ((bytes_reserved == 2 * DEPRECATED_REGISTER_SIZE) -- && (offset[i] % 2 * DEPRECATED_REGISTER_SIZE)) -- { -- int new_offset = 0; -- /* BYTES_RESERVED is already aligned to the word, so we put -- the argument at one word more down the stack. -- -- This will leave one empty word on the stack, and one unused -- register as mandated by the ABI. */ -- new_offset = ((offset[i] + 2 * DEPRECATED_REGISTER_SIZE - 1) -- & -(2 * DEPRECATED_REGISTER_SIZE)); -- -- if ((new_offset - offset[i]) >= 2 * DEPRECATED_REGISTER_SIZE) -- { -- bytes_reserved += DEPRECATED_REGISTER_SIZE; -- offset[i] += DEPRECATED_REGISTER_SIZE; -- } -- } -- -- cum_bytes_reserved += bytes_reserved; -- -- } -- -- /* CUM_BYTES_RESERVED already accounts for all the arguments passed -- by the user. However, the ABI mandates minimum stack space -- allocations for outgoing arguments. -- -- The ABI also mandates minimum stack alignments which we must -- preserve. */ -- cum_bytes_aligned = DEPRECATED_STACK_ALIGN (cum_bytes_reserved); -- sp += max (cum_bytes_aligned, REG_PARM_STACK_SPACE); -- -- /* Now write each of the args at the proper offset down the stack. -- ?!? We need to promote values to a full register instead of skipping -- words in the stack. */ -- for (i = 0; i < nargs; i++) -- write_memory (sp - offset[i], VALUE_CONTENTS (args[i]), lengths[i]); -- -- /* If a structure has to be returned, set up register 28 to hold its -- address */ -- if (struct_return) -- write_register (28, struct_addr); -- -- /* The stack will have 32 bytes of additional space for a frame marker. */ -- return sp + 32; --} -- --#endif -- --/* This function pushes a stack frame with arguments as part of the -- inferior function calling mechanism. -- -- This is the version of the function for the 32-bit PA machines, in -- which later arguments appear at lower addresses. (The stack always -- grows towards higher addresses.) -- -- We simply allocate the appropriate amount of stack space and put -- arguments into their proper slots. */ -- --CORE_ADDR --hppa32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, -- struct regcache *regcache, CORE_ADDR bp_addr, -- int nargs, struct value **args, CORE_ADDR sp, -- int struct_return, CORE_ADDR struct_addr) --{ -- /* NOTE: cagney/2004-02-27: This is a guess - its implemented by -- reverse engineering testsuite failures. */ -- -- /* Stack base address at which any pass-by-reference parameters are -- stored. */ -- CORE_ADDR struct_end = 0; -- /* Stack base address at which the first parameter is stored. */ -- CORE_ADDR param_end = 0; -- -- /* The inner most end of the stack after all the parameters have -- been pushed. */ -- CORE_ADDR new_sp = 0; -- -- /* Two passes. First pass computes the location of everything, -- second pass writes the bytes out. */ -- int write_pass; -- for (write_pass = 0; write_pass < 2; write_pass++) -- { -- CORE_ADDR struct_ptr = 0; -- CORE_ADDR param_ptr = 0; -- int reg = 27; /* NOTE: Registers go down. */ -- int i; -- for (i = 0; i < nargs; i++) -- { -- struct value *arg = args[i]; -- struct type *type = check_typedef (VALUE_TYPE (arg)); -- /* The corresponding parameter that is pushed onto the -- stack, and [possibly] passed in a register. */ -- char param_val[8]; -- int param_len; -- memset (param_val, 0, sizeof param_val); -- if (TYPE_LENGTH (type) > 8) -- { -- /* Large parameter, pass by reference. Store the value -- in "struct" area and then pass its address. */ -- param_len = 4; -- struct_ptr += align_up (TYPE_LENGTH (type), 8); -- if (write_pass) -- write_memory (struct_end - struct_ptr, VALUE_CONTENTS (arg), -- TYPE_LENGTH (type)); -- store_unsigned_integer (param_val, 4, struct_end - struct_ptr); -- } -- else if (TYPE_CODE (type) == TYPE_CODE_INT -- || TYPE_CODE (type) == TYPE_CODE_ENUM) -- { -- /* Integer value store, right aligned. "unpack_long" -- takes care of any sign-extension problems. */ -- param_len = align_up (TYPE_LENGTH (type), 4); -- store_unsigned_integer (param_val, param_len, -- unpack_long (type, -- VALUE_CONTENTS (arg))); -- } -- else -- { -- /* Small struct value, store right aligned? */ -- param_len = align_up (TYPE_LENGTH (type), 4); -- memcpy (param_val + param_len - TYPE_LENGTH (type), -- VALUE_CONTENTS (arg), TYPE_LENGTH (type)); -- } -- param_ptr += param_len; -- reg -= param_len / 4; -- if (write_pass) -- { -- write_memory (param_end - param_ptr, param_val, param_len); -- if (reg >= 23) -- { -- regcache_cooked_write (regcache, reg, param_val); -- if (param_len > 4) -- regcache_cooked_write (regcache, reg + 1, param_val + 4); -- } -- } -- } -- -- /* Update the various stack pointers. */ -- if (!write_pass) -- { -- struct_end = sp + struct_ptr; -- /* PARAM_PTR already accounts for all the arguments passed -- by the user. However, the ABI mandates minimum stack -- space allocations for outgoing arguments. The ABI also -- mandates minimum stack alignments which we must -- preserve. */ -- param_end = struct_end + max (align_up (param_ptr, 8), -- REG_PARM_STACK_SPACE); -- } -- } -- -- /* If a structure has to be returned, set up register 28 to hold its -- address */ -- if (struct_return) -- write_register (28, struct_addr); -- -- /* Set the return address. */ -- regcache_cooked_write_unsigned (regcache, RP_REGNUM, bp_addr); -- -- /* Update the Stack Pointer. */ -- regcache_cooked_write_unsigned (regcache, SP_REGNUM, param_end + 32); -- -- /* The stack will have 32 bytes of additional space for a frame marker. */ -- return param_end + 32; --} -- --/* This function pushes a stack frame with arguments as part of the -- inferior function calling mechanism. -- -- This is the version for the PA64, in which later arguments appear -- at higher addresses. (The stack always grows towards higher -- addresses.) -- -- We simply allocate the appropriate amount of stack space and put -- arguments into their proper slots. -- -- This ABI also requires that the caller provide an argument pointer -- to the callee, so we do that too. */ -- --CORE_ADDR --hppa64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, -- struct regcache *regcache, CORE_ADDR bp_addr, -- int nargs, struct value **args, CORE_ADDR sp, -- int struct_return, CORE_ADDR struct_addr) --{ -- /* Array of arguments' offsets. */ -- int *offset = (int *) alloca (nargs * sizeof (int)); -- -- /* Array of arguments' lengths: real lengths in bytes, not aligned -- to word size. */ -- int *lengths = (int *) alloca (nargs * sizeof (int)); -- -- /* The value of SP as it was passed into this function. */ -- CORE_ADDR orig_sp = sp; -- -- /* The number of stack bytes occupied by the current argument. */ -- int bytes_reserved; -- -- /* The total number of bytes reserved for the arguments. */ -- int cum_bytes_reserved = 0; -- -- /* Similarly, but aligned. */ -- int cum_bytes_aligned = 0; -- int i; -- -- /* Iterate over each argument provided by the user. */ -- for (i = 0; i < nargs; i++) -- { -- struct type *arg_type = VALUE_TYPE (args[i]); -- -- /* Integral scalar values smaller than a register are padded on -- the left. We do this by promoting them to full-width, -- although the ABI says to pad them with garbage. */ -- if (is_integral_type (arg_type) -- && TYPE_LENGTH (arg_type) < DEPRECATED_REGISTER_SIZE) -- { -- args[i] = value_cast ((TYPE_UNSIGNED (arg_type) -- ? builtin_type_unsigned_long -- : builtin_type_long), -- args[i]); -- arg_type = VALUE_TYPE (args[i]); -- } -- -- lengths[i] = TYPE_LENGTH (arg_type); -- -- /* Align the size of the argument to the word size for this -- target. */ -- bytes_reserved = (lengths[i] + DEPRECATED_REGISTER_SIZE - 1) & -DEPRECATED_REGISTER_SIZE; -- -- offset[i] = cum_bytes_reserved; -- -- /* Aggregates larger than eight bytes (the only types larger -- than eight bytes we have) are aligned on a 16-byte boundary, -- possibly padded on the right with garbage. This may leave an -- empty word on the stack, and thus an unused register, as per -- the ABI. */ -- if (bytes_reserved > 8) -- { -- /* Round up the offset to a multiple of two slots. */ -- int new_offset = ((offset[i] + 2*DEPRECATED_REGISTER_SIZE-1) -- & -(2*DEPRECATED_REGISTER_SIZE)); -- -- /* Note the space we've wasted, if any. */ -- bytes_reserved += new_offset - offset[i]; -- offset[i] = new_offset; -- } -- -- cum_bytes_reserved += bytes_reserved; -- } -- -- /* CUM_BYTES_RESERVED already accounts for all the arguments passed -- by the user. However, the ABIs mandate minimum stack space -- allocations for outgoing arguments. -- -- The ABIs also mandate minimum stack alignments which we must -- preserve. */ -- cum_bytes_aligned = align_up (cum_bytes_reserved, 16); -- sp += max (cum_bytes_aligned, REG_PARM_STACK_SPACE); -- -- /* Now write each of the args at the proper offset down the -- stack. */ -- for (i = 0; i < nargs; i++) -- write_memory (orig_sp + offset[i], VALUE_CONTENTS (args[i]), lengths[i]); -- -- /* If a structure has to be returned, set up register 28 to hold its -- address */ -- if (struct_return) -- write_register (28, struct_addr); -- -- /* For the PA64 we must pass a pointer to the outgoing argument -- list. The ABI mandates that the pointer should point to the -- first byte of storage beyond the register flushback area. -- -- However, the call dummy expects the outgoing argument pointer to -- be passed in register %r4. */ -- write_register (4, orig_sp + REG_PARM_STACK_SPACE); -- -- /* ?!? This needs further work. We need to set up the global data -- pointer for this procedure. This assumes the same global pointer -- for every procedure. The call dummy expects the dp value to be -- passed in register %r6. */ -- write_register (6, read_register (27)); -- -- /* Set the return address. */ -- regcache_cooked_write_unsigned (regcache, RP_REGNUM, bp_addr); -- -- /* Update the Stack Pointer. */ -- regcache_cooked_write_unsigned (regcache, SP_REGNUM, sp + 64); -- -- /* The stack will have 64 bytes of additional space for a frame -- marker. */ -- return sp + 64; -- --} -- --static CORE_ADDR --hppa32_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) --{ -- /* HP frames are 64-byte (or cache line) aligned (yes that's _byte_ -- and not _bit_)! */ -- return align_up (addr, 64); --} -- --/* Force all frames to 16-byte alignment. Better safe than sorry. */ -- --static CORE_ADDR --hppa64_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) --{ -- /* Just always 16-byte align. */ -- return align_up (addr, 16); --} -- -- --/* elz: Used to lookup a symbol in the shared libraries. -- This function calls shl_findsym, indirectly through a -- call to __d_shl_get. __d_shl_get is in end.c, which is always -- linked in by the hp compilers/linkers. -- The call to shl_findsym cannot be made directly because it needs -- to be active in target address space. -- inputs: - minimal symbol pointer for the function we want to look up -- - address in target space of the descriptor for the library -- where we want to look the symbol up. -- This address is retrieved using the -- som_solib_get_solib_by_pc function (somsolib.c). -- output: - real address in the library of the function. -- note: the handle can be null, in which case shl_findsym will look for -- the symbol in all the loaded shared libraries. -- files to look at if you need reference on this stuff: -- dld.c, dld_shl_findsym.c -- end.c -- man entry for shl_findsym */ -- --CORE_ADDR --find_stub_with_shl_get (struct minimal_symbol *function, CORE_ADDR handle) --{ -- struct symbol *get_sym, *symbol2; -- struct minimal_symbol *buff_minsym, *msymbol; -- struct type *ftype; -- struct value **args; -- struct value *funcval; -- struct value *val; -- -- int x, namelen, err_value, tmp = -1; -- CORE_ADDR endo_buff_addr, value_return_addr, errno_return_addr; -- CORE_ADDR stub_addr; -- -- -- args = alloca (sizeof (struct value *) * 8); /* 6 for the arguments and one null one??? */ -- funcval = find_function_in_inferior ("__d_shl_get"); -- get_sym = lookup_symbol ("__d_shl_get", NULL, VAR_DOMAIN, NULL, NULL); -- buff_minsym = lookup_minimal_symbol ("__buffer", NULL, NULL); -- msymbol = lookup_minimal_symbol ("__shldp", NULL, NULL); -- symbol2 = lookup_symbol ("__shldp", NULL, VAR_DOMAIN, NULL, NULL); -- endo_buff_addr = SYMBOL_VALUE_ADDRESS (buff_minsym); -- namelen = strlen (DEPRECATED_SYMBOL_NAME (function)); -- value_return_addr = endo_buff_addr + namelen; -- ftype = check_typedef (SYMBOL_TYPE (get_sym)); -- -- /* do alignment */ -- if ((x = value_return_addr % 64) != 0) -- value_return_addr = value_return_addr + 64 - x; -- -- errno_return_addr = value_return_addr + 64; -- -- -- /* set up stuff needed by __d_shl_get in buffer in end.o */ -- -- target_write_memory (endo_buff_addr, DEPRECATED_SYMBOL_NAME (function), namelen); -- -- target_write_memory (value_return_addr, (char *) &tmp, 4); -- -- target_write_memory (errno_return_addr, (char *) &tmp, 4); -- -- target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol), -- (char *) &handle, 4); -- -- /* now prepare the arguments for the call */ -- -- args[0] = value_from_longest (TYPE_FIELD_TYPE (ftype, 0), 12); -- args[1] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 1), SYMBOL_VALUE_ADDRESS (msymbol)); -- args[2] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 2), endo_buff_addr); -- args[3] = value_from_longest (TYPE_FIELD_TYPE (ftype, 3), TYPE_PROCEDURE); -- args[4] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 4), value_return_addr); -- args[5] = value_from_pointer (TYPE_FIELD_TYPE (ftype, 5), errno_return_addr); -- -- /* now call the function */ -- -- val = call_function_by_hand (funcval, 6, args); -- -- /* now get the results */ -- -- target_read_memory (errno_return_addr, (char *) &err_value, sizeof (err_value)); -- -- target_read_memory (value_return_addr, (char *) &stub_addr, sizeof (stub_addr)); -- if (stub_addr <= 0) -- error ("call to __d_shl_get failed, error code is %d", err_value); -- -- return (stub_addr); --} -- --/* Cover routine for find_stub_with_shl_get to pass to catch_errors */ --static int --cover_find_stub_with_shl_get (void *args_untyped) --{ -- args_for_find_stub *args = args_untyped; -- args->return_val = find_stub_with_shl_get (args->msym, args->solib_handle); -- return 0; --} -- --/* Insert the specified number of args and function address -- into a call sequence of the above form stored at DUMMYNAME. -- -- On the hppa we need to call the stack dummy through $$dyncall. -- Therefore our version of DEPRECATED_FIX_CALL_DUMMY takes an extra -- argument, real_pc, which is the location where gdb should start up -- the inferior to do the function call. -- -- This has to work across several versions of hpux, bsd, osf1. It has to -- work regardless of what compiler was used to build the inferior program. -- It should work regardless of whether or not end.o is available. It has -- to work even if gdb can not call into the dynamic loader in the inferior -- to query it for symbol names and addresses. -- -- Yes, all those cases should work. Luckily code exists to handle most -- of them. The complexity is in selecting exactly what scheme should -- be used to perform the inferior call. -- -- At the current time this routine is known not to handle cases where -- the program was linked with HP's compiler without including end.o. -- -- Please contact Jeff Law (law@cygnus.com) before changing this code. */ -- --CORE_ADDR --hppa_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, -- struct value **args, struct type *type, int gcc_p) --{ -- CORE_ADDR dyncall_addr; -- struct minimal_symbol *msymbol; -- struct minimal_symbol *trampoline; -- int flags = read_register (FLAGS_REGNUM); -- struct unwind_table_entry *u = NULL; -- CORE_ADDR new_stub = 0; -- CORE_ADDR solib_handle = 0; -- -- /* Nonzero if we will use GCC's PLT call routine. This routine must be -- passed an import stub, not a PLABEL. It is also necessary to set %r19 -- (the PIC register) before performing the call. -- -- If zero, then we are using __d_plt_call (HP's PLT call routine) or we -- are calling the target directly. When using __d_plt_call we want to -- use a PLABEL instead of an import stub. */ -- int using_gcc_plt_call = 1; -- --#ifdef GDB_TARGET_IS_HPPA_20W -- /* We currently use completely different code for the PA2.0W inferior -- function call sequences. This needs to be cleaned up. */ -- { -- CORE_ADDR pcsqh, pcsqt, pcoqh, pcoqt, sr5; -- struct target_waitstatus w; -- int inst1, inst2; -- char buf[4]; -- int status; -- struct objfile *objfile; -- -- /* We can not modify the PC space queues directly, so we start -- up the inferior and execute a couple instructions to set the -- space queues so that they point to the call dummy in the stack. */ -- pcsqh = read_register (PCSQ_HEAD_REGNUM); -- sr5 = read_register (SR5_REGNUM); -- if (1) -- { -- pcoqh = read_register (PCOQ_HEAD_REGNUM); -- pcoqt = read_register (PCOQ_TAIL_REGNUM); -- if (target_read_memory (pcoqh, buf, 4) != 0) -- error ("Couldn't modify space queue\n"); -- inst1 = extract_unsigned_integer (buf, 4); -- -- if (target_read_memory (pcoqt, buf, 4) != 0) -- error ("Couldn't modify space queue\n"); -- inst2 = extract_unsigned_integer (buf, 4); -- -- /* BVE (r1) */ -- *((int *) buf) = 0xe820d000; -- if (target_write_memory (pcoqh, buf, 4) != 0) -- error ("Couldn't modify space queue\n"); -- -- /* NOP */ -- *((int *) buf) = 0x08000240; -- if (target_write_memory (pcoqt, buf, 4) != 0) -- { -- *((int *) buf) = inst1; -- target_write_memory (pcoqh, buf, 4); -- error ("Couldn't modify space queue\n"); -- } -- -- write_register (1, pc); -- -- /* Single step twice, the BVE instruction will set the space queue -- such that it points to the PC value written immediately above -- (ie the call dummy). */ -- resume (1, 0); -- target_wait (inferior_ptid, &w); -- resume (1, 0); -- target_wait (inferior_ptid, &w); -- -- /* Restore the two instructions at the old PC locations. */ -- *((int *) buf) = inst1; -- target_write_memory (pcoqh, buf, 4); -- *((int *) buf) = inst2; -- target_write_memory (pcoqt, buf, 4); -- } -- -- /* The call dummy wants the ultimate destination address initially -- in register %r5. */ -- write_register (5, fun); -- -- /* We need to see if this objfile has a different DP value than our -- own (it could be a shared library for example). */ -- ALL_OBJFILES (objfile) -- { -- struct obj_section *s; -- obj_private_data_t *obj_private; -- -- /* See if FUN is in any section within this shared library. */ -- for (s = objfile->sections; s < objfile->sections_end; s++) -- if (s->addr <= fun && fun < s->endaddr) -- break; -- -- if (s >= objfile->sections_end) -- continue; -- -- obj_private = (obj_private_data_t *) objfile->obj_private; -- -- /* The DP value may be different for each objfile. But within an -- objfile each function uses the same dp value. Thus we do not need -- to grope around the opd section looking for dp values. -- -- ?!? This is not strictly correct since we may be in a shared library -- and want to call back into the main program. To make that case -- work correctly we need to set obj_private->dp for the main program's -- objfile, then remove this conditional. */ -- if (obj_private->dp) -- write_register (27, obj_private->dp); -- break; -- } -- return pc; -- } --#endif -- --#ifndef GDB_TARGET_IS_HPPA_20W -- /* Prefer __gcc_plt_call over the HP supplied routine because -- __gcc_plt_call works for any number of arguments. */ -- trampoline = NULL; -- if (lookup_minimal_symbol ("__gcc_plt_call", NULL, NULL) == NULL) -- using_gcc_plt_call = 0; -- -- msymbol = lookup_minimal_symbol ("$$dyncall", NULL, NULL); -- if (msymbol == NULL) -- error ("Can't find an address for $$dyncall trampoline"); -- -- dyncall_addr = SYMBOL_VALUE_ADDRESS (msymbol); -- -- /* FUN could be a procedure label, in which case we have to get -- its real address and the value of its GOT/DP if we plan to -- call the routine via gcc_plt_call. */ -- if ((fun & 0x2) && using_gcc_plt_call) -- { -- /* Get the GOT/DP value for the target function. It's -- at *(fun+4). Note the call dummy is *NOT* allowed to -- trash %r19 before calling the target function. */ -- write_register (19, read_memory_integer ((fun & ~0x3) + 4, -- DEPRECATED_REGISTER_SIZE)); -- -- /* Now get the real address for the function we are calling, it's -- at *fun. */ -- fun = (CORE_ADDR) read_memory_integer (fun & ~0x3, -- TARGET_PTR_BIT / 8); -- } -- else -- { -- --#ifndef GDB_TARGET_IS_PA_ELF -- /* FUN could be an export stub, the real address of a function, or -- a PLABEL. When using gcc's PLT call routine we must call an import -- stub rather than the export stub or real function for lazy binding -- to work correctly -- -- If we are using the gcc PLT call routine, then we need to -- get the import stub for the target function. */ -- if (using_gcc_plt_call && som_solib_get_got_by_pc (fun)) -- { -- struct objfile *objfile; -- struct minimal_symbol *funsymbol, *stub_symbol; -- CORE_ADDR newfun = 0; -- -- funsymbol = lookup_minimal_symbol_by_pc (fun); -- if (!funsymbol) -- error ("Unable to find minimal symbol for target function.\n"); -- -- /* Search all the object files for an import symbol with the -- right name. */ -- ALL_OBJFILES (objfile) -- { -- stub_symbol -- = lookup_minimal_symbol_solib_trampoline -- (DEPRECATED_SYMBOL_NAME (funsymbol), objfile); -- -- if (!stub_symbol) -- stub_symbol = lookup_minimal_symbol (DEPRECATED_SYMBOL_NAME (funsymbol), -- NULL, objfile); -- -- /* Found a symbol with the right name. */ -- if (stub_symbol) -- { -- struct unwind_table_entry *u; -- /* It must be a shared library trampoline. */ -- if (MSYMBOL_TYPE (stub_symbol) != mst_solib_trampoline) -- continue; -- -- /* It must also be an import stub. */ -- u = find_unwind_entry (SYMBOL_VALUE (stub_symbol)); -- if (u == NULL -- || (u->stub_unwind.stub_type != IMPORT --#ifdef GDB_NATIVE_HPUX_11 -- /* Sigh. The hpux 10.20 dynamic linker will blow -- chunks if we perform a call to an unbound function -- via the IMPORT_SHLIB stub. The hpux 11.00 dynamic -- linker will blow chunks if we do not call the -- unbound function via the IMPORT_SHLIB stub. -- -- We currently have no way to select bevahior on just -- the target. However, we only support HPUX/SOM in -- native mode. So we conditinalize on a native -- #ifdef. Ugly. Ugly. Ugly */ -- && u->stub_unwind.stub_type != IMPORT_SHLIB --#endif -- )) -- continue; -- -- /* OK. Looks like the correct import stub. */ -- newfun = SYMBOL_VALUE (stub_symbol); -- fun = newfun; -- -- /* If we found an IMPORT stub, then we want to stop -- searching now. If we found an IMPORT_SHLIB, we want -- to continue the search in the hopes that we will find -- an IMPORT stub. */ -- if (u->stub_unwind.stub_type == IMPORT) -- break; -- } -- } -- -- /* Ouch. We did not find an import stub. Make an attempt to -- do the right thing instead of just croaking. Most of the -- time this will actually work. */ -- if (newfun == 0) -- write_register (19, som_solib_get_got_by_pc (fun)); -- -- u = find_unwind_entry (fun); -- if (u -- && (u->stub_unwind.stub_type == IMPORT -- || u->stub_unwind.stub_type == IMPORT_SHLIB)) -- trampoline = lookup_minimal_symbol ("__gcc_plt_call", NULL, NULL); -- -- /* If we found the import stub in the shared library, then we have -- to set %r19 before we call the stub. */ -- if (u && u->stub_unwind.stub_type == IMPORT_SHLIB) -- write_register (19, som_solib_get_got_by_pc (fun)); -- } --#endif -- } -- -- /* If we are calling into another load module then have sr4export call the -- magic __d_plt_call routine which is linked in from end.o. -- -- You can't use _sr4export to make the call as the value in sp-24 will get -- fried and you end up returning to the wrong location. You can't call the -- target as the code to bind the PLT entry to a function can't return to a -- stack address. -- -- Also, query the dynamic linker in the inferior to provide a suitable -- PLABEL for the target function. */ -- if (!using_gcc_plt_call) -- { -- CORE_ADDR new_fun; -- -- /* Get a handle for the shared library containing FUN. Given the -- handle we can query the shared library for a PLABEL. */ -- solib_handle = som_solib_get_solib_by_pc (fun); -- -- if (solib_handle) -- { -- struct minimal_symbol *fmsymbol = lookup_minimal_symbol_by_pc (fun); -- -- trampoline = lookup_minimal_symbol ("__d_plt_call", NULL, NULL); -- -- if (trampoline == NULL) -- { -- error ("Can't find an address for __d_plt_call or __gcc_plt_call trampoline\nSuggest linking executable with -g or compiling with gcc."); -- } -- -- /* This is where sr4export will jump to. */ -- new_fun = SYMBOL_VALUE_ADDRESS (trampoline); -- -- /* If the function is in a shared library, then call __d_shl_get to -- get a PLABEL for the target function. */ -- new_stub = find_stub_with_shl_get (fmsymbol, solib_handle); -- -- if (new_stub == 0) -- error ("Can't find an import stub for %s", DEPRECATED_SYMBOL_NAME (fmsymbol)); -- -- /* We have to store the address of the stub in __shlib_funcptr. */ -- msymbol = lookup_minimal_symbol ("__shlib_funcptr", NULL, -- (struct objfile *) NULL); -- -- if (msymbol == NULL) -- error ("Can't find an address for __shlib_funcptr"); -- target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol), -- (char *) &new_stub, 4); -- -- /* We want sr4export to call __d_plt_call, so we claim it is -- the final target. Clear trampoline. */ -- fun = new_fun; -- trampoline = NULL; -- } -- } -- -- /* Store upper 21 bits of function address into ldil. fun will either be -- the final target (most cases) or __d_plt_call when calling into a shared -- library and __gcc_plt_call is not available. */ -- store_unsigned_integer -- (&dummy[FUNC_LDIL_OFFSET], -- INSTRUCTION_SIZE, -- deposit_21 (fun >> 11, -- extract_unsigned_integer (&dummy[FUNC_LDIL_OFFSET], -- INSTRUCTION_SIZE))); -- -- /* Store lower 11 bits of function address into ldo */ -- store_unsigned_integer -- (&dummy[FUNC_LDO_OFFSET], -- INSTRUCTION_SIZE, -- deposit_14 (fun & MASK_11, -- extract_unsigned_integer (&dummy[FUNC_LDO_OFFSET], -- INSTRUCTION_SIZE))); --#ifdef SR4EXPORT_LDIL_OFFSET -- -- { -- CORE_ADDR trampoline_addr; -- -- /* We may still need sr4export's address too. */ -- -- if (trampoline == NULL) -- { -- msymbol = lookup_minimal_symbol ("_sr4export", NULL, NULL); -- if (msymbol == NULL) -- error ("Can't find an address for _sr4export trampoline"); -- -- trampoline_addr = SYMBOL_VALUE_ADDRESS (msymbol); -- } -- else -- trampoline_addr = SYMBOL_VALUE_ADDRESS (trampoline); -- -- -- /* Store upper 21 bits of trampoline's address into ldil */ -- store_unsigned_integer -- (&dummy[SR4EXPORT_LDIL_OFFSET], -- INSTRUCTION_SIZE, -- deposit_21 (trampoline_addr >> 11, -- extract_unsigned_integer (&dummy[SR4EXPORT_LDIL_OFFSET], -- INSTRUCTION_SIZE))); -- -- /* Store lower 11 bits of trampoline's address into ldo */ -- store_unsigned_integer -- (&dummy[SR4EXPORT_LDO_OFFSET], -- INSTRUCTION_SIZE, -- deposit_14 (trampoline_addr & MASK_11, -- extract_unsigned_integer (&dummy[SR4EXPORT_LDO_OFFSET], -- INSTRUCTION_SIZE))); -- } --#endif -- -- write_register (22, pc); -- -- /* If we are in a syscall, then we should call the stack dummy -- directly. $$dyncall is not needed as the kernel sets up the -- space id registers properly based on the value in %r31. In -- fact calling $$dyncall will not work because the value in %r22 -- will be clobbered on the syscall exit path. -- -- Similarly if the current PC is in a shared library. Note however, -- this scheme won't work if the shared library isn't mapped into -- the same space as the stack. */ -- if (flags & 2) -- return pc; --#ifndef GDB_TARGET_IS_PA_ELF -- else if (som_solib_get_got_by_pc (hppa_target_read_pc (inferior_ptid))) -- return pc; --#endif -- else -- return dyncall_addr; --#endif --} -- --/* If the pid is in a syscall, then the FP register is not readable. -- We'll return zero in that case, rather than attempting to read it -- and cause a warning. */ -- --CORE_ADDR --hppa_read_fp (int pid) --{ -- int flags = read_register (FLAGS_REGNUM); -- -- if (flags & 2) -- { -- return (CORE_ADDR) 0; -- } -- -- /* This is the only site that may directly read_register () the FP -- register. All others must use deprecated_read_fp (). */ -- return read_register (DEPRECATED_FP_REGNUM); --} -- --CORE_ADDR --hppa_target_read_fp (void) --{ -- return hppa_read_fp (PIDGET (inferior_ptid)); --} -- --/* Get the PC from %r31 if currently in a syscall. Also mask out privilege -- bits. */ -- --CORE_ADDR --hppa_target_read_pc (ptid_t ptid) --{ -- int flags = read_register_pid (FLAGS_REGNUM, ptid); -- -- /* The following test does not belong here. It is OS-specific, and belongs -- in native code. */ -- /* Test SS_INSYSCALL */ -- if (flags & 2) -- return read_register_pid (31, ptid) & ~0x3; -- -- return read_register_pid (PC_REGNUM, ptid) & ~0x3; --} -- --/* Write out the PC. If currently in a syscall, then also write the new -- PC value into %r31. */ -- --void --hppa_target_write_pc (CORE_ADDR v, ptid_t ptid) --{ -- int flags = read_register_pid (FLAGS_REGNUM, ptid); -- -- /* The following test does not belong here. It is OS-specific, and belongs -- in native code. */ -- /* If in a syscall, then set %r31. Also make sure to get the -- privilege bits set correctly. */ -- /* Test SS_INSYSCALL */ -- if (flags & 2) -- write_register_pid (31, v | 0x3, ptid); -- -- write_register_pid (PC_REGNUM, v, ptid); -- write_register_pid (PCOQ_TAIL_REGNUM, v + 4, ptid); --} -- --/* return the alignment of a type in bytes. Structures have the maximum -- alignment required by their fields. */ -- --static int --hppa_alignof (struct type *type) --{ -- int max_align, align, i; -- CHECK_TYPEDEF (type); -- switch (TYPE_CODE (type)) -- { -- case TYPE_CODE_PTR: -- case TYPE_CODE_INT: -- case TYPE_CODE_FLT: -- return TYPE_LENGTH (type); -- case TYPE_CODE_ARRAY: -- return hppa_alignof (TYPE_FIELD_TYPE (type, 0)); -- case TYPE_CODE_STRUCT: -- case TYPE_CODE_UNION: -- max_align = 1; -- for (i = 0; i < TYPE_NFIELDS (type); i++) -- { -- /* Bit fields have no real alignment. */ -- /* if (!TYPE_FIELD_BITPOS (type, i)) */ -- if (!TYPE_FIELD_BITSIZE (type, i)) /* elz: this should be bitsize */ -- { -- align = hppa_alignof (TYPE_FIELD_TYPE (type, i)); -- max_align = max (max_align, align); -- } -- } -- return max_align; -- default: -- return 4; -- } --} -- --/* Print the register regnum, or all registers if regnum is -1 */ -- --void --pa_do_registers_info (int regnum, int fpregs) --{ -- char *raw_regs = alloca (DEPRECATED_REGISTER_BYTES); -- int i; -- -- /* Make a copy of gdb's save area (may cause actual -- reads from the target). */ -- for (i = 0; i < NUM_REGS; i++) -- frame_register_read (deprecated_selected_frame, i, -- raw_regs + DEPRECATED_REGISTER_BYTE (i)); -- -- if (regnum == -1) -- pa_print_registers (raw_regs, regnum, fpregs); -- else if (regnum < FP4_REGNUM) -- { -- long reg_val[2]; -- -- /* Why is the value not passed through "extract_signed_integer" -- as in "pa_print_registers" below? */ -- pa_register_look_aside (raw_regs, regnum, ®_val[0]); -- -- if (!is_pa_2) -- { -- printf_unfiltered ("%s %lx\n", REGISTER_NAME (regnum), reg_val[1]); -- } -- else -- { -- /* Fancy % formats to prevent leading zeros. */ -- if (reg_val[0] == 0) -- printf_unfiltered ("%s %lx\n", REGISTER_NAME (regnum), reg_val[1]); -- else -- printf_unfiltered ("%s %lx%8.8lx\n", REGISTER_NAME (regnum), -- reg_val[0], reg_val[1]); -- } -- } -- else -- /* Note that real floating point values only start at -- FP4_REGNUM. FP0 and up are just status and error -- registers, which have integral (bit) values. */ -- pa_print_fp_reg (regnum); --} -- --/********** new function ********************/ --void --pa_do_strcat_registers_info (int regnum, int fpregs, struct ui_file *stream, -- enum precision_type precision) --{ -- char *raw_regs = alloca (DEPRECATED_REGISTER_BYTES); -- int i; -- -- /* Make a copy of gdb's save area (may cause actual -- reads from the target). */ -- for (i = 0; i < NUM_REGS; i++) -- frame_register_read (deprecated_selected_frame, i, -- raw_regs + DEPRECATED_REGISTER_BYTE (i)); -- -- if (regnum == -1) -- pa_strcat_registers (raw_regs, regnum, fpregs, stream); -- -- else if (regnum < FP4_REGNUM) -- { -- long reg_val[2]; -- -- /* Why is the value not passed through "extract_signed_integer" -- as in "pa_print_registers" below? */ -- pa_register_look_aside (raw_regs, regnum, ®_val[0]); -- -- if (!is_pa_2) -- { -- fprintf_unfiltered (stream, "%s %lx", REGISTER_NAME (regnum), reg_val[1]); -- } -- else -- { -- /* Fancy % formats to prevent leading zeros. */ -- if (reg_val[0] == 0) -- fprintf_unfiltered (stream, "%s %lx", REGISTER_NAME (regnum), -- reg_val[1]); -- else -- fprintf_unfiltered (stream, "%s %lx%8.8lx", REGISTER_NAME (regnum), -- reg_val[0], reg_val[1]); -- } -- } -- else -- /* Note that real floating point values only start at -- FP4_REGNUM. FP0 and up are just status and error -- registers, which have integral (bit) values. */ -- pa_strcat_fp_reg (regnum, stream, precision); --} -- --/* If this is a PA2.0 machine, fetch the real 64-bit register -- value. Otherwise use the info from gdb's saved register area. -- -- Note that reg_val is really expected to be an array of longs, -- with two elements. */ --static void --pa_register_look_aside (char *raw_regs, int regnum, long *raw_val) --{ -- static int know_which = 0; /* False */ -- -- int regaddr; -- unsigned int offset; -- int i; -- int start; -- -- -- char buf[MAX_REGISTER_SIZE]; -- long long reg_val; -- -- if (!know_which) -- { -- if (CPU_PA_RISC2_0 == sysconf (_SC_CPU_VERSION)) -- { -- is_pa_2 = (1 == 1); -- } -- -- know_which = 1; /* True */ -- } -- -- raw_val[0] = 0; -- raw_val[1] = 0; -- -- if (!is_pa_2) -- { -- raw_val[1] = *(long *) (raw_regs + DEPRECATED_REGISTER_BYTE (regnum)); -- return; -- } -- -- /* Code below copied from hppah-nat.c, with fixes for wide -- registers, using different area of save_state, etc. */ -- if (regnum == FLAGS_REGNUM || regnum >= FP0_REGNUM || -- !HAVE_STRUCT_SAVE_STATE_T || !HAVE_STRUCT_MEMBER_SS_WIDE) -- { -- /* Use narrow regs area of save_state and default macro. */ -- offset = U_REGS_OFFSET; -- regaddr = register_addr (regnum, offset); -- start = 1; -- } -- else -- { -- /* Use wide regs area, and calculate registers as 8 bytes wide. -- -- We'd like to do this, but current version of "C" doesn't -- permit "offsetof": -- -- offset = offsetof(save_state_t, ss_wide); -- -- Note that to avoid "C" doing typed pointer arithmetic, we -- have to cast away the type in our offset calculation: -- otherwise we get an offset of 1! */ -- -- /* NB: save_state_t is not available before HPUX 9. -- The ss_wide field is not available previous to HPUX 10.20, -- so to avoid compile-time warnings, we only compile this for -- PA 2.0 processors. This control path should only be followed -- if we're debugging a PA 2.0 processor, so this should not cause -- problems. */ -- -- /* #if the following code out so that this file can still be -- compiled on older HPUX boxes (< 10.20) which don't have -- this structure/structure member. */ --#if HAVE_STRUCT_SAVE_STATE_T == 1 && HAVE_STRUCT_MEMBER_SS_WIDE == 1 -- save_state_t temp; -- -- offset = ((int) &temp.ss_wide) - ((int) &temp); -- regaddr = offset + regnum * 8; -- start = 0; --#endif -- } -- -- for (i = start; i < 2; i++) -- { -- errno = 0; -- raw_val[i] = call_ptrace (PT_RUREGS, PIDGET (inferior_ptid), -- (PTRACE_ARG3_TYPE) regaddr, 0); -- if (errno != 0) -- { -- /* Warning, not error, in case we are attached; sometimes the -- kernel doesn't let us at the registers. */ -- char *err = safe_strerror (errno); -- char *msg = alloca (strlen (err) + 128); -- sprintf (msg, "reading register %s: %s", REGISTER_NAME (regnum), err); -- warning (msg); -- goto error_exit; -- } -- -- regaddr += sizeof (long); -- } -- -- if (regnum == PCOQ_HEAD_REGNUM || regnum == PCOQ_TAIL_REGNUM) -- raw_val[1] &= ~0x3; /* I think we're masking out space bits */ -- --error_exit: -- ; --} -- --/* "Info all-reg" command */ -- --static void --pa_print_registers (char *raw_regs, int regnum, int fpregs) --{ -- int i, j; -- /* Alas, we are compiled so that "long long" is 32 bits */ -- long raw_val[2]; -- long long_val; -- int rows = 48, columns = 2; -- -- for (i = 0; i < rows; i++) -- { -- for (j = 0; j < columns; j++) -- { -- /* We display registers in column-major order. */ -- int regnum = i + j * rows; -- -- /* Q: Why is the value passed through "extract_signed_integer", -- while above, in "pa_do_registers_info" it isn't? -- A: ? */ -- pa_register_look_aside (raw_regs, regnum, &raw_val[0]); -- -- /* Even fancier % formats to prevent leading zeros -- and still maintain the output in columns. */ -- if (!is_pa_2) -- { -- /* Being big-endian, on this machine the low bits -- (the ones we want to look at) are in the second longword. */ -- long_val = extract_signed_integer (&raw_val[1], 4); -- printf_filtered ("%10.10s: %8lx ", -- REGISTER_NAME (regnum), long_val); -- } -- else -- { -- /* raw_val = extract_signed_integer(&raw_val, 8); */ -- if (raw_val[0] == 0) -- printf_filtered ("%10.10s: %8lx ", -- REGISTER_NAME (regnum), raw_val[1]); -- else -- printf_filtered ("%10.10s: %8lx%8.8lx ", -- REGISTER_NAME (regnum), -- raw_val[0], raw_val[1]); -- } -- } -- printf_unfiltered ("\n"); -- } -- -- if (fpregs) -- for (i = FP4_REGNUM; i < NUM_REGS; i++) /* FP4_REGNUM == 72 */ -- pa_print_fp_reg (i); -+ /* The stack will have 32 bytes of additional space for a frame marker. */ -+ return param_end + 64; - } - --/************* new function ******************/ --static void --pa_strcat_registers (char *raw_regs, int regnum, int fpregs, -- struct ui_file *stream) -+static CORE_ADDR -+hppa32_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) - { -- int i, j; -- long raw_val[2]; /* Alas, we are compiled so that "long long" is 32 bits */ -- long long_val; -- enum precision_type precision; -- -- precision = unspecified_precision; -- -- for (i = 0; i < 18; i++) -- { -- for (j = 0; j < 4; j++) -- { -- /* Q: Why is the value passed through "extract_signed_integer", -- while above, in "pa_do_registers_info" it isn't? -- A: ? */ -- pa_register_look_aside (raw_regs, i + (j * 18), &raw_val[0]); -- -- /* Even fancier % formats to prevent leading zeros -- and still maintain the output in columns. */ -- if (!is_pa_2) -- { -- /* Being big-endian, on this machine the low bits -- (the ones we want to look at) are in the second longword. */ -- long_val = extract_signed_integer (&raw_val[1], 4); -- fprintf_filtered (stream, "%8.8s: %8lx ", -- REGISTER_NAME (i + (j * 18)), long_val); -- } -- else -- { -- /* raw_val = extract_signed_integer(&raw_val, 8); */ -- if (raw_val[0] == 0) -- fprintf_filtered (stream, "%8.8s: %8lx ", -- REGISTER_NAME (i + (j * 18)), raw_val[1]); -- else -- fprintf_filtered (stream, "%8.8s: %8lx%8.8lx ", -- REGISTER_NAME (i + (j * 18)), raw_val[0], -- raw_val[1]); -- } -- } -- fprintf_unfiltered (stream, "\n"); -- } -- -- if (fpregs) -- for (i = FP4_REGNUM; i < NUM_REGS; i++) /* FP4_REGNUM == 72 */ -- pa_strcat_fp_reg (i, stream, precision); -+ /* HP frames are 64-byte (or cache line) aligned (yes that's _byte_ -+ and not _bit_)! */ -+ return align_up (addr, 64); - } - --static void --pa_print_fp_reg (int i) --{ -- char raw_buffer[MAX_REGISTER_SIZE]; -- char virtual_buffer[MAX_REGISTER_SIZE]; -- -- /* Get 32bits of data. */ -- frame_register_read (deprecated_selected_frame, i, raw_buffer); -- -- /* Put it in the buffer. No conversions are ever necessary. */ -- memcpy (virtual_buffer, raw_buffer, DEPRECATED_REGISTER_RAW_SIZE (i)); -- -- fputs_filtered (REGISTER_NAME (i), gdb_stdout); -- print_spaces_filtered (8 - strlen (REGISTER_NAME (i)), gdb_stdout); -- fputs_filtered ("(single precision) ", gdb_stdout); -+/* Force all frames to 16-byte alignment. Better safe than sorry. */ - -- val_print (DEPRECATED_REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, gdb_stdout, 0, -- 1, 0, Val_pretty_default); -- printf_filtered ("\n"); -+static CORE_ADDR -+hppa64_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) -+{ -+ /* Just always 16-byte align. */ -+ return align_up (addr, 16); -+} - -- /* If "i" is even, then this register can also be a double-precision -- FP register. Dump it out as such. */ -- if ((i % 2) == 0) -- { -- /* Get the data in raw format for the 2nd half. */ -- frame_register_read (deprecated_selected_frame, i + 1, raw_buffer); - -- /* Copy it into the appropriate part of the virtual buffer. */ -- memcpy (virtual_buffer + DEPRECATED_REGISTER_RAW_SIZE (i), raw_buffer, -- DEPRECATED_REGISTER_RAW_SIZE (i)); -- -- /* Dump it as a double. */ -- fputs_filtered (REGISTER_NAME (i), gdb_stdout); -- print_spaces_filtered (8 - strlen (REGISTER_NAME (i)), gdb_stdout); -- fputs_filtered ("(double precision) ", gdb_stdout); -- -- val_print (builtin_type_double, virtual_buffer, 0, 0, gdb_stdout, 0, -- 1, 0, Val_pretty_default); -- printf_filtered ("\n"); -- } --} -+/* Get the PC from %r31 if currently in a syscall. Also mask out privilege -+ bits. */ - --/*************** new function ***********************/ --static void --pa_strcat_fp_reg (int i, struct ui_file *stream, enum precision_type precision) -+CORE_ADDR -+hppa_target_read_pc (ptid_t ptid) - { -- char raw_buffer[MAX_REGISTER_SIZE]; -- char virtual_buffer[MAX_REGISTER_SIZE]; -- -- fputs_filtered (REGISTER_NAME (i), stream); -- print_spaces_filtered (8 - strlen (REGISTER_NAME (i)), stream); -+ int flags = read_register_pid (FLAGS_REGNUM, ptid); - -- /* Get 32bits of data. */ -- frame_register_read (deprecated_selected_frame, i, raw_buffer); -+ /* The following test does not belong here. It is OS-specific, and belongs -+ in native code. */ -+ /* Test SS_INSYSCALL */ -+ if (flags & 2) -+ return read_register_pid (31, ptid) & ~0x3; - -- /* Put it in the buffer. No conversions are ever necessary. */ -- memcpy (virtual_buffer, raw_buffer, DEPRECATED_REGISTER_RAW_SIZE (i)); -+ return read_register_pid (PCOQ_HEAD_REGNUM, ptid) & ~0x3; -+} - -- if (precision == double_precision && (i % 2) == 0) -- { -+/* Write out the PC. If currently in a syscall, then also write the new -+ PC value into %r31. */ - -- char raw_buf[MAX_REGISTER_SIZE]; -+void -+hppa_target_write_pc (CORE_ADDR v, ptid_t ptid) -+{ -+ int flags = read_register_pid (FLAGS_REGNUM, ptid); - -- /* Get the data in raw format for the 2nd half. */ -- frame_register_read (deprecated_selected_frame, i + 1, raw_buf); -+ /* The following test does not belong here. It is OS-specific, and belongs -+ in native code. */ -+ /* If in a syscall, then set %r31. Also make sure to get the -+ privilege bits set correctly. */ -+ /* Test SS_INSYSCALL */ -+ if (flags & 2) -+ write_register_pid (31, v | 0x3, ptid); - -- /* Copy it into the appropriate part of the virtual buffer. */ -- memcpy (virtual_buffer + DEPRECATED_REGISTER_RAW_SIZE (i), raw_buf, -- DEPRECATED_REGISTER_RAW_SIZE (i)); -+ write_register_pid (PCOQ_HEAD_REGNUM, v, ptid); -+ write_register_pid (PCOQ_TAIL_REGNUM, v + 4, ptid); -+} - -- val_print (builtin_type_double, virtual_buffer, 0, 0, stream, 0, -- 1, 0, Val_pretty_default); -+/* return the alignment of a type in bytes. Structures have the maximum -+ alignment required by their fields. */ - -- } -- else -+static int -+hppa_alignof (struct type *type) -+{ -+ int max_align, align, i; -+ CHECK_TYPEDEF (type); -+ switch (TYPE_CODE (type)) - { -- val_print (DEPRECATED_REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, stream, 0, -- 1, 0, Val_pretty_default); -+ case TYPE_CODE_PTR: -+ case TYPE_CODE_INT: -+ case TYPE_CODE_FLT: -+ return TYPE_LENGTH (type); -+ case TYPE_CODE_ARRAY: -+ return hppa_alignof (TYPE_FIELD_TYPE (type, 0)); -+ case TYPE_CODE_STRUCT: -+ case TYPE_CODE_UNION: -+ max_align = 1; -+ for (i = 0; i < TYPE_NFIELDS (type); i++) -+ { -+ /* Bit fields have no real alignment. */ -+ /* if (!TYPE_FIELD_BITPOS (type, i)) */ -+ if (!TYPE_FIELD_BITSIZE (type, i)) /* elz: this should be bitsize */ -+ { -+ align = hppa_alignof (TYPE_FIELD_TYPE (type, i)); -+ max_align = max (max_align, align); -+ } -+ } -+ return max_align; -+ default: -+ return 4; - } -- - } - - /* Return one if PC is in the call path of a trampoline, else return zero. -@@ -3867,7 +1585,7 @@ - rp from sp - 8. */ - if (prev_inst == 0x4bc23ff1) - return (read_memory_integer -- (read_register (SP_REGNUM) - 8, 4)) & ~0x3; -+ (read_register (HPPA_SP_REGNUM) - 8, 4)) & ~0x3; - else - { - warning ("Unable to find restore of %%rp before bv (%%rp)."); -@@ -3881,7 +1599,7 @@ - else if ((curr_inst & 0xffe0f000) == 0xe840d000) - { - return (read_memory_integer -- (read_register (SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3; -+ (read_register (HPPA_SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3; - } - - /* What about be,n 0(sr0,%rp)? It's just another way we return to -@@ -3893,7 +1611,7 @@ - I guess we could check for the previous instruction being - mtsp %r1,%sr0 if we want to do sanity checking. */ - return (read_memory_integer -- (read_register (SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3; -+ (read_register (HPPA_SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3; - } - - /* Haven't found the branch yet, but we're still in the stub. -@@ -4080,7 +1798,7 @@ - for (i = 3; i < u->Entry_GR + 3; i++) - { - /* Frame pointer gets saved into a special location. */ -- if (u->Save_SP && i == DEPRECATED_FP_REGNUM) -+ if (u->Save_SP && i == HPPA_FP_REGNUM) - continue; - - save_gr |= (1 << i); -@@ -4267,334 +1985,78 @@ - goto restart; - } - -- return pc; --} -- -- --/* Return the address of the PC after the last prologue instruction if -- we can determine it from the debug symbols. Else return zero. */ -- --static CORE_ADDR --after_prologue (CORE_ADDR pc) --{ -- struct symtab_and_line sal; -- CORE_ADDR func_addr, func_end; -- struct symbol *f; -- -- /* If we can not find the symbol in the partial symbol table, then -- there is no hope we can determine the function's start address -- with this code. */ -- if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end)) -- return 0; -- -- /* Get the line associated with FUNC_ADDR. */ -- sal = find_pc_line (func_addr, 0); -- -- /* There are only two cases to consider. First, the end of the source line -- is within the function bounds. In that case we return the end of the -- source line. Second is the end of the source line extends beyond the -- bounds of the current function. We need to use the slow code to -- examine instructions in that case. -- -- Anything else is simply a bug elsewhere. Fixing it here is absolutely -- the wrong thing to do. In fact, it should be entirely possible for this -- function to always return zero since the slow instruction scanning code -- is supposed to *always* work. If it does not, then it is a bug. */ -- if (sal.end < func_end) -- return sal.end; -- else -- return 0; --} -- --/* To skip prologues, I use this predicate. Returns either PC itself -- if the code at PC does not look like a function prologue; otherwise -- returns an address that (if we're lucky) follows the prologue. If -- LENIENT, then we must skip everything which is involved in setting -- up the frame (it's OK to skip more, just so long as we don't skip -- anything which might clobber the registers which are being saved. -- Currently we must not skip more on the alpha, but we might the lenient -- stuff some day. */ -- --CORE_ADDR --hppa_skip_prologue (CORE_ADDR pc) --{ -- unsigned long inst; -- int offset; -- CORE_ADDR post_prologue_pc; -- char buf[4]; -- -- /* See if we can determine the end of the prologue via the symbol table. -- If so, then return either PC, or the PC after the prologue, whichever -- is greater. */ -- -- post_prologue_pc = after_prologue (pc); -- -- /* If after_prologue returned a useful address, then use it. Else -- fall back on the instruction skipping code. -- -- Some folks have claimed this causes problems because the breakpoint -- may be the first instruction of the prologue. If that happens, then -- the instruction skipping code has a bug that needs to be fixed. */ -- if (post_prologue_pc != 0) -- return max (pc, post_prologue_pc); -- else -- return (skip_prologue_hard_way (pc)); --} -- --/* Put here the code to store, into the SAVED_REGS, the addresses of -- the saved registers of frame described by FRAME_INFO. This -- includes special registers such as pc and fp saved in special ways -- in the stack frame. sp is even more special: the address we return -- for it IS the sp for the next frame. */ -- --void --hppa_frame_find_saved_regs (struct frame_info *frame_info, -- CORE_ADDR frame_saved_regs[]) --{ -- CORE_ADDR pc; -- struct unwind_table_entry *u; -- unsigned long inst, stack_remaining, save_gr, save_fr, save_rp, save_sp; -- int status, i, reg; -- char buf[4]; -- int fp_loc = -1; -- int final_iteration; -- -- /* Zero out everything. */ -- memset (frame_saved_regs, '\0', SIZEOF_FRAME_SAVED_REGS); -- -- /* Call dummy frames always look the same, so there's no need to -- examine the dummy code to determine locations of saved registers; -- instead, let find_dummy_frame_regs fill in the correct offsets -- for the saved registers. */ -- if ((get_frame_pc (frame_info) >= get_frame_base (frame_info) -- && (get_frame_pc (frame_info) -- <= (get_frame_base (frame_info) -- /* A call dummy is sized in words, but it is actually a -- series of instructions. Account for that scaling -- factor. */ -- + ((DEPRECATED_REGISTER_SIZE / INSTRUCTION_SIZE) -- * DEPRECATED_CALL_DUMMY_LENGTH) -- /* Similarly we have to account for 64bit wide register -- saves. */ -- + (32 * DEPRECATED_REGISTER_SIZE) -- /* We always consider FP regs 8 bytes long. */ -- + (NUM_REGS - FP0_REGNUM) * 8 -- /* Similarly we have to account for 64bit wide register -- saves. */ -- + (6 * DEPRECATED_REGISTER_SIZE))))) -- find_dummy_frame_regs (frame_info, frame_saved_regs); -- -- /* Interrupt handlers are special too. They lay out the register -- state in the exact same order as the register numbers in GDB. */ -- if (pc_in_interrupt_handler (get_frame_pc (frame_info))) -- { -- for (i = 0; i < NUM_REGS; i++) -- { -- /* SP is a little special. */ -- if (i == SP_REGNUM) -- frame_saved_regs[SP_REGNUM] -- = read_memory_integer (get_frame_base (frame_info) + SP_REGNUM * 4, -- TARGET_PTR_BIT / 8); -- else -- frame_saved_regs[i] = get_frame_base (frame_info) + i * 4; -- } -- return; -- } -- --#ifdef FRAME_FIND_SAVED_REGS_IN_SIGTRAMP -- /* Handle signal handler callers. */ -- if ((get_frame_type (frame_info) == SIGTRAMP_FRAME)) -- { -- FRAME_FIND_SAVED_REGS_IN_SIGTRAMP (frame_info, frame_saved_regs); -- return; -- } --#endif -- -- /* Get the starting address of the function referred to by the PC -- saved in frame. */ -- pc = get_frame_func (frame_info); -- -- /* Yow! */ -- u = find_unwind_entry (pc); -- if (!u) -- return; -- -- /* This is how much of a frame adjustment we need to account for. */ -- stack_remaining = u->Total_frame_size << 3; -- -- /* Magic register saves we want to know about. */ -- save_rp = u->Save_RP; -- save_sp = u->Save_SP; -- -- /* Turn the Entry_GR field into a bitmask. */ -- save_gr = 0; -- for (i = 3; i < u->Entry_GR + 3; i++) -- { -- /* Frame pointer gets saved into a special location. */ -- if (u->Save_SP && i == DEPRECATED_FP_REGNUM) -- continue; -- -- save_gr |= (1 << i); -- } -- -- /* Turn the Entry_FR field into a bitmask too. */ -- save_fr = 0; -- for (i = 12; i < u->Entry_FR + 12; i++) -- save_fr |= (1 << i); -- -- /* The frame always represents the value of %sp at entry to the -- current function (and is thus equivalent to the "saved" stack -- pointer. */ -- frame_saved_regs[SP_REGNUM] = get_frame_base (frame_info); -- -- /* Loop until we find everything of interest or hit a branch. -- -- For unoptimized GCC code and for any HP CC code this will never ever -- examine any user instructions. -- -- For optimized GCC code we're faced with problems. GCC will schedule -- its prologue and make prologue instructions available for delay slot -- filling. The end result is user code gets mixed in with the prologue -- and a prologue instruction may be in the delay slot of the first branch -- or call. -- -- Some unexpected things are expected with debugging optimized code, so -- we allow this routine to walk past user instructions in optimized -- GCC code. */ -- final_iteration = 0; -- while ((save_gr || save_fr || save_rp || save_sp || stack_remaining > 0) -- && pc <= get_frame_pc (frame_info)) -- { -- status = target_read_memory (pc, buf, 4); -- inst = extract_unsigned_integer (buf, 4); -- -- /* Yow! */ -- if (status != 0) -- return; -- -- /* Note the interesting effects of this instruction. */ -- stack_remaining -= prologue_inst_adjust_sp (inst); -- -- /* There are limited ways to store the return pointer into the -- stack. */ -- if (inst == 0x6bc23fd9) /* stw rp,-0x14(sr0,sp) */ -- { -- save_rp = 0; -- frame_saved_regs[RP_REGNUM] = get_frame_base (frame_info) - 20; -- } -- else if (inst == 0x0fc212c1) /* std rp,-0x10(sr0,sp) */ -- { -- save_rp = 0; -- frame_saved_regs[RP_REGNUM] = get_frame_base (frame_info) - 16; -- } -- -- /* Note if we saved SP into the stack. This also happens to indicate -- the location of the saved frame pointer. */ -- if ( (inst & 0xffffc000) == 0x6fc10000 /* stw,ma r1,N(sr0,sp) */ -- || (inst & 0xffffc00c) == 0x73c10008) /* std,ma r1,N(sr0,sp) */ -- { -- frame_saved_regs[DEPRECATED_FP_REGNUM] = get_frame_base (frame_info); -- save_sp = 0; -- } -- -- /* Account for general and floating-point register saves. */ -- reg = inst_saves_gr (inst); -- if (reg >= 3 && reg <= 18 -- && (!u->Save_SP || reg != DEPRECATED_FP_REGNUM)) -- { -- save_gr &= ~(1 << reg); -+ return pc; -+} - -- /* stwm with a positive displacement is a *post modify*. */ -- if ((inst >> 26) == 0x1b -- && extract_14 (inst) >= 0) -- frame_saved_regs[reg] = get_frame_base (frame_info); -- /* A std has explicit post_modify forms. */ -- else if ((inst & 0xfc00000c) == 0x70000008) -- frame_saved_regs[reg] = get_frame_base (frame_info); -- else -- { -- CORE_ADDR offset; - -- if ((inst >> 26) == 0x1c) -- offset = (inst & 0x1 ? -1 << 13 : 0) | (((inst >> 4) & 0x3ff) << 3); -- else if ((inst >> 26) == 0x03) -- offset = low_sign_extend (inst & 0x1f, 5); -- else -- offset = extract_14 (inst); -+/* Return the address of the PC after the last prologue instruction if -+ we can determine it from the debug symbols. Else return zero. */ - -- /* Handle code with and without frame pointers. */ -- if (u->Save_SP) -- frame_saved_regs[reg] -- = get_frame_base (frame_info) + offset; -- else -- frame_saved_regs[reg] -- = (get_frame_base (frame_info) + (u->Total_frame_size << 3) -- + offset); -- } -- } -+static CORE_ADDR -+after_prologue (CORE_ADDR pc) -+{ -+ struct symtab_and_line sal; -+ CORE_ADDR func_addr, func_end; -+ struct symbol *f; - -+ /* If we can not find the symbol in the partial symbol table, then -+ there is no hope we can determine the function's start address -+ with this code. */ -+ if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end)) -+ return 0; - -- /* GCC handles callee saved FP regs a little differently. -+ /* Get the line associated with FUNC_ADDR. */ -+ sal = find_pc_line (func_addr, 0); - -- It emits an instruction to put the value of the start of -- the FP store area into %r1. It then uses fstds,ma with -- a basereg of %r1 for the stores. -- -- HP CC emits them at the current stack pointer modifying -- the stack pointer as it stores each register. */ -- -- /* ldo X(%r3),%r1 or ldo X(%r30),%r1. */ -- if ((inst & 0xffffc000) == 0x34610000 -- || (inst & 0xffffc000) == 0x37c10000) -- fp_loc = extract_14 (inst); -+ /* There are only two cases to consider. First, the end of the source line -+ is within the function bounds. In that case we return the end of the -+ source line. Second is the end of the source line extends beyond the -+ bounds of the current function. We need to use the slow code to -+ examine instructions in that case. - -- reg = inst_saves_fr (inst); -- if (reg >= 12 && reg <= 21) -- { -- /* Note +4 braindamage below is necessary because the FP status -- registers are internally 8 registers rather than the expected -- 4 registers. */ -- save_fr &= ~(1 << reg); -- if (fp_loc == -1) -- { -- /* 1st HP CC FP register store. After this instruction -- we've set enough state that the GCC and HPCC code are -- both handled in the same manner. */ -- frame_saved_regs[reg + FP4_REGNUM + 4] = get_frame_base (frame_info); -- fp_loc = 8; -- } -- else -- { -- frame_saved_regs[reg + FP0_REGNUM + 4] -- = get_frame_base (frame_info) + fp_loc; -- fp_loc += 8; -- } -- } -+ Anything else is simply a bug elsewhere. Fixing it here is absolutely -+ the wrong thing to do. In fact, it should be entirely possible for this -+ function to always return zero since the slow instruction scanning code -+ is supposed to *always* work. If it does not, then it is a bug. */ -+ if (sal.end < func_end) -+ return sal.end; -+ else -+ return 0; -+} - -- /* Quit if we hit any kind of branch the previous iteration. */ -- if (final_iteration) -- break; -+/* To skip prologues, I use this predicate. Returns either PC itself -+ if the code at PC does not look like a function prologue; otherwise -+ returns an address that (if we're lucky) follows the prologue. If -+ LENIENT, then we must skip everything which is involved in setting -+ up the frame (it's OK to skip more, just so long as we don't skip -+ anything which might clobber the registers which are being saved. -+ Currently we must not skip more on the alpha, but we might the lenient -+ stuff some day. */ - -- /* We want to look precisely one instruction beyond the branch -- if we have not found everything yet. */ -- if (is_branch (inst)) -- final_iteration = 1; -+CORE_ADDR -+hppa_skip_prologue (CORE_ADDR pc) -+{ -+ unsigned long inst; -+ int offset; -+ CORE_ADDR post_prologue_pc; -+ char buf[4]; - -- /* Bump the PC. */ -- pc += 4; -- } --} -+ /* See if we can determine the end of the prologue via the symbol table. -+ If so, then return either PC, or the PC after the prologue, whichever -+ is greater. */ - --/* XXX - deprecated. This is a compatibility function for targets -- that do not yet implement DEPRECATED_FRAME_INIT_SAVED_REGS. */ --/* Find the addresses in which registers are saved in FRAME. */ -+ post_prologue_pc = after_prologue (pc); - --static void --hppa_frame_init_saved_regs (struct frame_info *frame) --{ -- if (deprecated_get_frame_saved_regs (frame) == NULL) -- frame_saved_regs_zalloc (frame); -- hppa_frame_find_saved_regs (frame, deprecated_get_frame_saved_regs (frame)); -+ /* If after_prologue returned a useful address, then use it. Else -+ fall back on the instruction skipping code. -+ -+ Some folks have claimed this causes problems because the breakpoint -+ may be the first instruction of the prologue. If that happens, then -+ the instruction skipping code has a bug that needs to be fixed. */ -+ if (post_prologue_pc != 0) -+ return max (pc, post_prologue_pc); -+ else -+ return (skip_prologue_hard_way (pc)); - } - - struct hppa_frame_cache -@@ -4630,7 +2092,7 @@ - for (i = 3; i < u->Entry_GR + 3; i++) - { - /* Frame pointer gets saved into a special location. */ -- if (u->Save_SP && i == DEPRECATED_FP_REGNUM) -+ if (u->Save_SP && i == HPPA_FP_REGNUM) - continue; - - saved_gr_mask |= (1 << i); -@@ -4700,13 +2162,13 @@ - || (inst & 0xffffc00c) == 0x73c10008) /* std,ma r1,N(sr0,sp) */ - { - looking_for_sp = 0; -- cache->saved_regs[DEPRECATED_FP_REGNUM].addr = 0; -+ cache->saved_regs[HPPA_FP_REGNUM].addr = 0; - } - - /* Account for general and floating-point register saves. */ - reg = inst_saves_gr (inst); - if (reg >= 3 && reg <= 18 -- && (!u->Save_SP || reg != DEPRECATED_FP_REGNUM)) -+ && (!u->Save_SP || reg != HPPA_FP_REGNUM)) - { - saved_gr_mask &= ~(1 << reg); - if ((inst >> 26) == 0x1b && extract_14 (inst) >= 0) -@@ -4766,7 +2228,7 @@ - } - else - { -- cache->saved_regs[reg + FP0_REGNUM + 4].addr = fp_loc; -+ cache->saved_regs[reg + HPPA_FP0_REGNUM + 4].addr = fp_loc; - fp_loc += 8; - } - } -@@ -4785,10 +2247,10 @@ - /* The frame base always represents the value of %sp at entry to - the current function (and is thus equivalent to the "saved" - stack pointer. */ -- CORE_ADDR this_sp = frame_unwind_register_unsigned (next_frame, SP_REGNUM); -+ CORE_ADDR this_sp = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM); - /* FIXME: cagney/2004-02-22: This assumes that the frame has been - created. If it hasn't everything will be out-of-wack. */ -- if (u->Save_SP && trad_frame_addr_p (cache->saved_regs, SP_REGNUM)) -+ if (u->Save_SP && trad_frame_addr_p (cache->saved_regs, HPPA_SP_REGNUM)) - /* Both we're expecting the SP to be saved and the SP has been - saved. The entry SP value is saved at this frame's SP - address. */ -@@ -4797,7 +2259,7 @@ - /* The prologue has been slowly allocating stack space. Adjust - the SP back. */ - cache->base = this_sp - frame_size; -- trad_frame_set_value (cache->saved_regs, SP_REGNUM, cache->base); -+ trad_frame_set_value (cache->saved_regs, HPPA_SP_REGNUM, cache->base); - } - - /* The PC is found in the "return register", "Millicode" uses "r31" -@@ -4907,468 +2369,14 @@ - hppa_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame) - { - return frame_id_build (frame_unwind_register_unsigned (next_frame, -- SP_REGNUM), -+ HPPA_SP_REGNUM), - frame_pc_unwind (next_frame)); - } - - static CORE_ADDR - hppa_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) - { -- return frame_unwind_register_signed (next_frame, PC_REGNUM) & ~3; --} -- --/* Exception handling support for the HP-UX ANSI C++ compiler. -- The compiler (aCC) provides a callback for exception events; -- GDB can set a breakpoint on this callback and find out what -- exception event has occurred. */ -- --/* The name of the hook to be set to point to the callback function */ --static char HP_ACC_EH_notify_hook[] = "__eh_notify_hook"; --/* The name of the function to be used to set the hook value */ --static char HP_ACC_EH_set_hook_value[] = "__eh_set_hook_value"; --/* The name of the callback function in end.o */ --static char HP_ACC_EH_notify_callback[] = "__d_eh_notify_callback"; --/* Name of function in end.o on which a break is set (called by above) */ --static char HP_ACC_EH_break[] = "__d_eh_break"; --/* Name of flag (in end.o) that enables catching throws */ --static char HP_ACC_EH_catch_throw[] = "__d_eh_catch_throw"; --/* Name of flag (in end.o) that enables catching catching */ --static char HP_ACC_EH_catch_catch[] = "__d_eh_catch_catch"; --/* The enum used by aCC */ --typedef enum -- { -- __EH_NOTIFY_THROW, -- __EH_NOTIFY_CATCH -- } --__eh_notification; -- --/* Is exception-handling support available with this executable? */ --static int hp_cxx_exception_support = 0; --/* Has the initialize function been run? */ --int hp_cxx_exception_support_initialized = 0; --/* Similar to above, but imported from breakpoint.c -- non-target-specific */ --extern int exception_support_initialized; --/* Address of __eh_notify_hook */ --static CORE_ADDR eh_notify_hook_addr = 0; --/* Address of __d_eh_notify_callback */ --static CORE_ADDR eh_notify_callback_addr = 0; --/* Address of __d_eh_break */ --static CORE_ADDR eh_break_addr = 0; --/* Address of __d_eh_catch_catch */ --static CORE_ADDR eh_catch_catch_addr = 0; --/* Address of __d_eh_catch_throw */ --static CORE_ADDR eh_catch_throw_addr = 0; --/* Sal for __d_eh_break */ --static struct symtab_and_line *break_callback_sal = 0; -- --/* Code in end.c expects __d_pid to be set in the inferior, -- otherwise __d_eh_notify_callback doesn't bother to call -- __d_eh_break! So we poke the pid into this symbol -- ourselves. -- 0 => success -- 1 => failure */ --int --setup_d_pid_in_inferior (void) --{ -- CORE_ADDR anaddr; -- struct minimal_symbol *msymbol; -- char buf[4]; /* FIXME 32x64? */ -- -- /* Slam the pid of the process into __d_pid; failing is only a warning! */ -- msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile); -- if (msymbol == NULL) -- { -- warning ("Unable to find __d_pid symbol in object file."); -- warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o)."); -- return 1; -- } -- -- anaddr = SYMBOL_VALUE_ADDRESS (msymbol); -- store_unsigned_integer (buf, 4, PIDGET (inferior_ptid)); /* FIXME 32x64? */ -- if (target_write_memory (anaddr, buf, 4)) /* FIXME 32x64? */ -- { -- warning ("Unable to write __d_pid"); -- warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o)."); -- return 1; -- } -- return 0; --} -- --/* Initialize exception catchpoint support by looking for the -- necessary hooks/callbacks in end.o, etc., and set the hook value to -- point to the required debug function -- -- Return 0 => failure -- 1 => success */ -- --static int --initialize_hp_cxx_exception_support (void) --{ -- struct symtabs_and_lines sals; -- struct cleanup *old_chain; -- struct cleanup *canonical_strings_chain = NULL; -- int i; -- char *addr_start; -- char *addr_end = NULL; -- char **canonical = (char **) NULL; -- int thread = -1; -- struct symbol *sym = NULL; -- struct minimal_symbol *msym = NULL; -- struct objfile *objfile; -- asection *shlib_info; -- -- /* Detect and disallow recursion. On HP-UX with aCC, infinite -- recursion is a possibility because finding the hook for exception -- callbacks involves making a call in the inferior, which means -- re-inserting breakpoints which can re-invoke this code */ -- -- static int recurse = 0; -- if (recurse > 0) -- { -- hp_cxx_exception_support_initialized = 0; -- exception_support_initialized = 0; -- return 0; -- } -- -- hp_cxx_exception_support = 0; -- -- /* First check if we have seen any HP compiled objects; if not, -- it is very unlikely that HP's idiosyncratic callback mechanism -- for exception handling debug support will be available! -- This will percolate back up to breakpoint.c, where our callers -- will decide to try the g++ exception-handling support instead. */ -- if (!hp_som_som_object_present) -- return 0; -- -- /* We have a SOM executable with SOM debug info; find the hooks */ -- -- /* First look for the notify hook provided by aCC runtime libs */ -- /* If we find this symbol, we conclude that the executable must -- have HP aCC exception support built in. If this symbol is not -- found, even though we're a HP SOM-SOM file, we may have been -- built with some other compiler (not aCC). This results percolates -- back up to our callers in breakpoint.c which can decide to -- try the g++ style of exception support instead. -- If this symbol is found but the other symbols we require are -- not found, there is something weird going on, and g++ support -- should *not* be tried as an alternative. -- -- ASSUMPTION: Only HP aCC code will have __eh_notify_hook defined. -- ASSUMPTION: HP aCC and g++ modules cannot be linked together. */ -- -- /* libCsup has this hook; it'll usually be non-debuggable */ -- msym = lookup_minimal_symbol (HP_ACC_EH_notify_hook, NULL, NULL); -- if (msym) -- { -- eh_notify_hook_addr = SYMBOL_VALUE_ADDRESS (msym); -- hp_cxx_exception_support = 1; -- } -- else -- { -- warning ("Unable to find exception callback hook (%s).", HP_ACC_EH_notify_hook); -- warning ("Executable may not have been compiled debuggable with HP aCC."); -- warning ("GDB will be unable to intercept exception events."); -- eh_notify_hook_addr = 0; -- hp_cxx_exception_support = 0; -- return 0; -- } -- -- /* Next look for the notify callback routine in end.o */ -- /* This is always available in the SOM symbol dictionary if end.o is linked in */ -- msym = lookup_minimal_symbol (HP_ACC_EH_notify_callback, NULL, NULL); -- if (msym) -- { -- eh_notify_callback_addr = SYMBOL_VALUE_ADDRESS (msym); -- hp_cxx_exception_support = 1; -- } -- else -- { -- warning ("Unable to find exception callback routine (%s).", HP_ACC_EH_notify_callback); -- warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o)."); -- warning ("GDB will be unable to intercept exception events."); -- eh_notify_callback_addr = 0; -- return 0; -- } -- --#ifndef GDB_TARGET_IS_HPPA_20W -- /* Check whether the executable is dynamically linked or archive bound */ -- /* With an archive-bound executable we can use the raw addresses we find -- for the callback function, etc. without modification. For an executable -- with shared libraries, we have to do more work to find the plabel, which -- can be the target of a call through $$dyncall from the aCC runtime support -- library (libCsup) which is linked shared by default by aCC. */ -- /* This test below was copied from somsolib.c/somread.c. It may not be a very -- reliable one to test that an executable is linked shared. pai/1997-07-18 */ -- shlib_info = bfd_get_section_by_name (symfile_objfile->obfd, "$SHLIB_INFO$"); -- if (shlib_info && (bfd_section_size (symfile_objfile->obfd, shlib_info) != 0)) -- { -- /* The minsym we have has the local code address, but that's not the -- plabel that can be used by an inter-load-module call. */ -- /* Find solib handle for main image (which has end.o), and use that -- and the min sym as arguments to __d_shl_get() (which does the equivalent -- of shl_findsym()) to find the plabel. */ -- -- args_for_find_stub args; -- static char message[] = "Error while finding exception callback hook:\n"; -- -- args.solib_handle = som_solib_get_solib_by_pc (eh_notify_callback_addr); -- args.msym = msym; -- args.return_val = 0; -- -- recurse++; -- catch_errors (cover_find_stub_with_shl_get, &args, message, -- RETURN_MASK_ALL); -- eh_notify_callback_addr = args.return_val; -- recurse--; -- -- exception_catchpoints_are_fragile = 1; -- -- if (!eh_notify_callback_addr) -- { -- /* We can get here either if there is no plabel in the export list -- for the main image, or if something strange happened (?) */ -- warning ("Couldn't find a plabel (indirect function label) for the exception callback."); -- warning ("GDB will not be able to intercept exception events."); -- return 0; -- } -- } -- else -- exception_catchpoints_are_fragile = 0; --#endif -- -- /* Now, look for the breakpointable routine in end.o */ -- /* This should also be available in the SOM symbol dict. if end.o linked in */ -- msym = lookup_minimal_symbol (HP_ACC_EH_break, NULL, NULL); -- if (msym) -- { -- eh_break_addr = SYMBOL_VALUE_ADDRESS (msym); -- hp_cxx_exception_support = 1; -- } -- else -- { -- warning ("Unable to find exception callback routine to set breakpoint (%s).", HP_ACC_EH_break); -- warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o)."); -- warning ("GDB will be unable to intercept exception events."); -- eh_break_addr = 0; -- return 0; -- } -- -- /* Next look for the catch enable flag provided in end.o */ -- sym = lookup_symbol (HP_ACC_EH_catch_catch, (struct block *) NULL, -- VAR_DOMAIN, 0, (struct symtab **) NULL); -- if (sym) /* sometimes present in debug info */ -- { -- eh_catch_catch_addr = SYMBOL_VALUE_ADDRESS (sym); -- hp_cxx_exception_support = 1; -- } -- else -- /* otherwise look in SOM symbol dict. */ -- { -- msym = lookup_minimal_symbol (HP_ACC_EH_catch_catch, NULL, NULL); -- if (msym) -- { -- eh_catch_catch_addr = SYMBOL_VALUE_ADDRESS (msym); -- hp_cxx_exception_support = 1; -- } -- else -- { -- warning ("Unable to enable interception of exception catches."); -- warning ("Executable may not have been compiled debuggable with HP aCC."); -- warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o)."); -- return 0; -- } -- } -- -- /* Next look for the catch enable flag provided end.o */ -- sym = lookup_symbol (HP_ACC_EH_catch_catch, (struct block *) NULL, -- VAR_DOMAIN, 0, (struct symtab **) NULL); -- if (sym) /* sometimes present in debug info */ -- { -- eh_catch_throw_addr = SYMBOL_VALUE_ADDRESS (sym); -- hp_cxx_exception_support = 1; -- } -- else -- /* otherwise look in SOM symbol dict. */ -- { -- msym = lookup_minimal_symbol (HP_ACC_EH_catch_throw, NULL, NULL); -- if (msym) -- { -- eh_catch_throw_addr = SYMBOL_VALUE_ADDRESS (msym); -- hp_cxx_exception_support = 1; -- } -- else -- { -- warning ("Unable to enable interception of exception throws."); -- warning ("Executable may not have been compiled debuggable with HP aCC."); -- warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o)."); -- return 0; -- } -- } -- -- /* Set the flags */ -- hp_cxx_exception_support = 2; /* everything worked so far */ -- hp_cxx_exception_support_initialized = 1; -- exception_support_initialized = 1; -- -- return 1; --} -- --/* Target operation for enabling or disabling interception of -- exception events. -- KIND is either EX_EVENT_THROW or EX_EVENT_CATCH -- ENABLE is either 0 (disable) or 1 (enable). -- Return value is NULL if no support found; -- -1 if something went wrong, -- or a pointer to a symtab/line struct if the breakpointable -- address was found. */ -- --struct symtab_and_line * --child_enable_exception_callback (enum exception_event_kind kind, int enable) --{ -- char buf[4]; -- -- if (!exception_support_initialized || !hp_cxx_exception_support_initialized) -- if (!initialize_hp_cxx_exception_support ()) -- return NULL; -- -- switch (hp_cxx_exception_support) -- { -- case 0: -- /* Assuming no HP support at all */ -- return NULL; -- case 1: -- /* HP support should be present, but something went wrong */ -- return (struct symtab_and_line *) -1; /* yuck! */ -- /* there may be other cases in the future */ -- } -- -- /* Set the EH hook to point to the callback routine */ -- store_unsigned_integer (buf, 4, enable ? eh_notify_callback_addr : 0); /* FIXME 32x64 problem */ -- /* pai: (temp) FIXME should there be a pack operation first? */ -- if (target_write_memory (eh_notify_hook_addr, buf, 4)) /* FIXME 32x64 problem */ -- { -- warning ("Could not write to target memory for exception event callback."); -- warning ("Interception of exception events may not work."); -- return (struct symtab_and_line *) -1; -- } -- if (enable) -- { -- /* Ensure that __d_pid is set up correctly -- end.c code checks this. :-( */ -- if (PIDGET (inferior_ptid) > 0) -- { -- if (setup_d_pid_in_inferior ()) -- return (struct symtab_and_line *) -1; -- } -- else -- { -- warning ("Internal error: Invalid inferior pid? Cannot intercept exception events."); -- return (struct symtab_and_line *) -1; -- } -- } -- -- switch (kind) -- { -- case EX_EVENT_THROW: -- store_unsigned_integer (buf, 4, enable ? 1 : 0); -- if (target_write_memory (eh_catch_throw_addr, buf, 4)) /* FIXME 32x64? */ -- { -- warning ("Couldn't enable exception throw interception."); -- return (struct symtab_and_line *) -1; -- } -- break; -- case EX_EVENT_CATCH: -- store_unsigned_integer (buf, 4, enable ? 1 : 0); -- if (target_write_memory (eh_catch_catch_addr, buf, 4)) /* FIXME 32x64? */ -- { -- warning ("Couldn't enable exception catch interception."); -- return (struct symtab_and_line *) -1; -- } -- break; -- default: -- error ("Request to enable unknown or unsupported exception event."); -- } -- -- /* Copy break address into new sal struct, malloc'ing if needed. */ -- if (!break_callback_sal) -- { -- break_callback_sal = (struct symtab_and_line *) xmalloc (sizeof (struct symtab_and_line)); -- } -- init_sal (break_callback_sal); -- break_callback_sal->symtab = NULL; -- break_callback_sal->pc = eh_break_addr; -- break_callback_sal->line = 0; -- break_callback_sal->end = eh_break_addr; -- -- return break_callback_sal; --} -- --/* Record some information about the current exception event */ --static struct exception_event_record current_ex_event; --/* Convenience struct */ --static struct symtab_and_line null_symtab_and_line = --{NULL, 0, 0, 0}; -- --/* Report current exception event. Returns a pointer to a record -- that describes the kind of the event, where it was thrown from, -- and where it will be caught. More information may be reported -- in the future */ --struct exception_event_record * --child_get_current_exception_event (void) --{ -- CORE_ADDR event_kind; -- CORE_ADDR throw_addr; -- CORE_ADDR catch_addr; -- struct frame_info *fi, *curr_frame; -- int level = 1; -- -- curr_frame = get_current_frame (); -- if (!curr_frame) -- return (struct exception_event_record *) NULL; -- -- /* Go up one frame to __d_eh_notify_callback, because at the -- point when this code is executed, there's garbage in the -- arguments of __d_eh_break. */ -- fi = find_relative_frame (curr_frame, &level); -- if (level != 0) -- return (struct exception_event_record *) NULL; -- -- select_frame (fi); -- -- /* Read in the arguments */ -- /* __d_eh_notify_callback() is called with 3 arguments: -- 1. event kind catch or throw -- 2. the target address if known -- 3. a flag -- not sure what this is. pai/1997-07-17 */ -- event_kind = read_register (ARG0_REGNUM); -- catch_addr = read_register (ARG1_REGNUM); -- -- /* Now go down to a user frame */ -- /* For a throw, __d_eh_break is called by -- __d_eh_notify_callback which is called by -- __notify_throw which is called -- from user code. -- For a catch, __d_eh_break is called by -- __d_eh_notify_callback which is called by -- <stackwalking stuff> which is called by -- __throw__<stuff> or __rethrow_<stuff> which is called -- from user code. */ -- /* FIXME: Don't use such magic numbers; search for the frames */ -- level = (event_kind == EX_EVENT_THROW) ? 3 : 4; -- fi = find_relative_frame (curr_frame, &level); -- if (level != 0) -- return (struct exception_event_record *) NULL; -- -- select_frame (fi); -- throw_addr = get_frame_pc (fi); -- -- /* Go back to original (top) frame */ -- select_frame (curr_frame); -- -- current_ex_event.kind = (enum exception_event_kind) event_kind; -- current_ex_event.throw_sal = find_pc_line (throw_addr, 1); -- current_ex_event.catch_sal = find_pc_line (catch_addr, 1); -- -- return ¤t_ex_event; -+ return frame_unwind_register_signed (next_frame, PCOQ_HEAD_REGNUM) & ~3; - } - - /* Instead of this nasty cast, add a method pvoid() that prints out a -@@ -5468,62 +2476,6 @@ - /* We can leave the tail's space the same, since there's no jump. */ - } - --/* Same as hppa32_store_return_value(), but for the PA64 ABI. */ -- --void --hppa64_store_return_value (struct type *type, char *valbuf) --{ -- if (TYPE_CODE (type) == TYPE_CODE_FLT) -- deprecated_write_register_bytes -- (DEPRECATED_REGISTER_BYTE (FP4_REGNUM) -- + DEPRECATED_REGISTER_SIZE - TYPE_LENGTH (type), -- valbuf, TYPE_LENGTH (type)); -- else if (is_integral_type(type)) -- deprecated_write_register_bytes -- (DEPRECATED_REGISTER_BYTE (28) -- + DEPRECATED_REGISTER_SIZE - TYPE_LENGTH (type), -- valbuf, TYPE_LENGTH (type)); -- else if (TYPE_LENGTH (type) <= 8) -- deprecated_write_register_bytes -- (DEPRECATED_REGISTER_BYTE (28),valbuf, TYPE_LENGTH (type)); -- else if (TYPE_LENGTH (type) <= 16) -- { -- deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (28),valbuf, 8); -- deprecated_write_register_bytes -- (DEPRECATED_REGISTER_BYTE (29), valbuf + 8, TYPE_LENGTH (type) - 8); -- } --} -- --/* Same as hppa32_extract_return_value but for the PA64 ABI case. */ -- --void --hppa64_extract_return_value (struct type *type, char *regbuf, char *valbuf) --{ -- /* RM: Floats are returned in FR4R, doubles in FR4. -- Integral values are in r28, padded on the left. -- Aggregates less that 65 bits are in r28, right padded. -- Aggregates upto 128 bits are in r28 and r29, right padded. */ -- if (TYPE_CODE (type) == TYPE_CODE_FLT) -- memcpy (valbuf, -- regbuf + DEPRECATED_REGISTER_BYTE (FP4_REGNUM) -- + DEPRECATED_REGISTER_SIZE - TYPE_LENGTH (type), -- TYPE_LENGTH (type)); -- else if (is_integral_type(type)) -- memcpy (valbuf, -- regbuf + DEPRECATED_REGISTER_BYTE (28) -- + DEPRECATED_REGISTER_SIZE - TYPE_LENGTH (type), -- TYPE_LENGTH (type)); -- else if (TYPE_LENGTH (type) <= 8) -- memcpy (valbuf, regbuf + DEPRECATED_REGISTER_BYTE (28), -- TYPE_LENGTH (type)); -- else if (TYPE_LENGTH (type) <= 16) -- { -- memcpy (valbuf, regbuf + DEPRECATED_REGISTER_BYTE (28), 8); -- memcpy (valbuf + 8, regbuf + DEPRECATED_REGISTER_BYTE (29), -- TYPE_LENGTH (type) - 8); -- } --} -- - int - hppa_reg_struct_has_addr (int gcc_p, struct type *type) - { -@@ -5539,13 +2491,6 @@ - return (lhs > rhs); - } - --CORE_ADDR --hppa64_stack_align (CORE_ADDR sp) --{ -- /* The PA64 ABI mandates a 16 byte stack alignment. */ -- return ((sp % 16) ? (sp + 15) & -16 : sp); --} -- - int - hppa_pc_requires_run_before_use (CORE_ADDR pc) - { -@@ -5586,56 +2531,30 @@ - return ((ipsw & 0x00200000) && !(flags & 0x2)); - } - --int --hppa_register_raw_size (int reg_nr) --{ -- /* All registers have the same size. */ -- return DEPRECATED_REGISTER_SIZE; --} -- --/* Index within the register vector of the first byte of the space i -- used for register REG_NR. */ -- --int --hppa_register_byte (int reg_nr) --{ -- struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); -- -- return reg_nr * tdep->bytes_per_address; --} -- - /* Return the GDB type object for the "standard" data type of data - in register N. */ - --struct type * --hppa32_register_virtual_type (int reg_nr) -+static struct type * -+hppa32_register_type (struct gdbarch *gdbarch, int reg_nr) - { - if (reg_nr < FP4_REGNUM) -- return builtin_type_int; -+ return builtin_type_uint32; - else -- return builtin_type_float; -+ return builtin_type_ieee_single_big; - } - - /* Return the GDB type object for the "standard" data type of data - in register N. hppa64 version. */ - --struct type * --hppa64_register_virtual_type (int reg_nr) -+static struct type * -+hppa64_register_type (struct gdbarch *gdbarch, int reg_nr) - { - if (reg_nr < FP4_REGNUM) -- return builtin_type_unsigned_long_long; -+ return builtin_type_uint64; - else -- return builtin_type_double; -+ return builtin_type_ieee_double_big; - } - --/* Store the address of the place in which to copy the structure the -- subroutine will return. This is called from call_function. */ -- --void --hppa_store_struct_return (CORE_ADDR addr, CORE_ADDR sp) --{ -- write_register (28, addr); --} - /* Return True if REGNUM is not a register available to the user - through ptrace(). */ - -@@ -5746,24 +2665,18 @@ - case 4: - set_gdbarch_num_regs (gdbarch, hppa32_num_regs); - set_gdbarch_register_name (gdbarch, hppa32_register_name); -- set_gdbarch_deprecated_register_virtual_type -- (gdbarch, hppa32_register_virtual_type); -+ set_gdbarch_register_type (gdbarch, hppa32_register_type); - break; - case 8: - set_gdbarch_num_regs (gdbarch, hppa64_num_regs); - set_gdbarch_register_name (gdbarch, hppa64_register_name); -- set_gdbarch_deprecated_register_virtual_type -- (gdbarch, hppa64_register_virtual_type); -+ set_gdbarch_register_type (gdbarch, hppa64_register_type); - break; - default: - internal_error (__FILE__, __LINE__, "Unsupported address size: %d", - tdep->bytes_per_address); - } - -- /* The following gdbarch vector elements depend on other parts of this -- vector which have been set above, depending on the ABI. */ -- set_gdbarch_deprecated_register_bytes -- (gdbarch, gdbarch_num_regs (gdbarch) * tdep->bytes_per_address); - set_gdbarch_long_bit (gdbarch, tdep->bytes_per_address * TARGET_CHAR_BIT); - set_gdbarch_ptr_bit (gdbarch, tdep->bytes_per_address * TARGET_CHAR_BIT); - -@@ -5781,23 +2694,14 @@ - set_gdbarch_in_solib_return_trampoline (gdbarch, - hppa_in_solib_return_trampoline); - set_gdbarch_inner_than (gdbarch, hppa_inner_than); -- set_gdbarch_deprecated_register_size (gdbarch, tdep->bytes_per_address); -- set_gdbarch_deprecated_fp_regnum (gdbarch, 3); -- set_gdbarch_sp_regnum (gdbarch, 30); -- set_gdbarch_fp0_regnum (gdbarch, 64); -- set_gdbarch_pc_regnum (gdbarch, PCOQ_HEAD_REGNUM); -- set_gdbarch_deprecated_register_raw_size (gdbarch, hppa_register_raw_size); -- set_gdbarch_deprecated_register_byte (gdbarch, hppa_register_byte); -- set_gdbarch_deprecated_register_virtual_size (gdbarch, hppa_register_raw_size); -- set_gdbarch_deprecated_max_register_raw_size (gdbarch, tdep->bytes_per_address); -- set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8); -+ set_gdbarch_sp_regnum (gdbarch, HPPA_SP_REGNUM); -+ set_gdbarch_fp0_regnum (gdbarch, HPPA_FP0_REGNUM); - set_gdbarch_cannot_store_register (gdbarch, hppa_cannot_store_register); - set_gdbarch_addr_bits_remove (gdbarch, hppa_smash_text_address); - set_gdbarch_smash_text_address (gdbarch, hppa_smash_text_address); - set_gdbarch_believe_pcc_promotion (gdbarch, 1); - set_gdbarch_read_pc (gdbarch, hppa_target_read_pc); - set_gdbarch_write_pc (gdbarch, hppa_target_write_pc); -- set_gdbarch_deprecated_target_read_fp (gdbarch, hppa_target_read_fp); - - /* Helper for function argument information. */ - set_gdbarch_fetch_pointer_argument (gdbarch, hppa_fetch_pointer_argument); -@@ -5818,26 +2722,11 @@ - set_gdbarch_frame_align (gdbarch, hppa32_frame_align); - break; - case 8: -- if (0) -- { -- set_gdbarch_push_dummy_call (gdbarch, hppa64_push_dummy_call); -- set_gdbarch_frame_align (gdbarch, hppa64_frame_align); -- break; -- } -- else -- { -- set_gdbarch_deprecated_call_dummy_breakpoint_offset (gdbarch, hppa64_call_dummy_breakpoint_offset); -- set_gdbarch_deprecated_call_dummy_length (gdbarch, hppa64_call_dummy_length); -- set_gdbarch_deprecated_stack_align (gdbarch, hppa64_stack_align); -- break; -- set_gdbarch_deprecated_push_dummy_frame (gdbarch, hppa_push_dummy_frame); -- /* set_gdbarch_deprecated_fix_call_dummy (gdbarch, hppa_fix_call_dummy); */ -- set_gdbarch_deprecated_push_arguments (gdbarch, hppa_push_arguments); -- set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0); -- set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack); -- set_gdbarch_call_dummy_location (gdbarch, ON_STACK); -- } -+ set_gdbarch_push_dummy_call (gdbarch, hppa64_push_dummy_call); -+ set_gdbarch_frame_align (gdbarch, hppa64_frame_align); - break; -+ default: -+ internal_error (__FILE__, __LINE__, "bad switch"); - } - - /* Struct return methods. */ -@@ -5847,43 +2736,17 @@ - set_gdbarch_return_value (gdbarch, hppa32_return_value); - break; - case 8: -- if (0) -- set_gdbarch_return_value (gdbarch, hppa64_return_value); -- else -- { -- set_gdbarch_deprecated_extract_return_value (gdbarch, hppa64_extract_return_value); -- set_gdbarch_use_struct_convention (gdbarch, hppa64_use_struct_convention); -- set_gdbarch_deprecated_store_return_value (gdbarch, hppa64_store_return_value); -- set_gdbarch_deprecated_store_struct_return (gdbarch, hppa_store_struct_return); -- } -+ set_gdbarch_return_value (gdbarch, hppa64_return_value); - break; - default: - internal_error (__FILE__, __LINE__, "bad switch"); - } - - /* Frame unwind methods. */ -- switch (tdep->bytes_per_address) -- { -- case 4: -- set_gdbarch_unwind_dummy_id (gdbarch, hppa_unwind_dummy_id); -- set_gdbarch_unwind_pc (gdbarch, hppa_unwind_pc); -- frame_unwind_append_sniffer (gdbarch, hppa_frame_unwind_sniffer); -- frame_base_append_sniffer (gdbarch, hppa_frame_base_sniffer); -- break; -- case 8: -- set_gdbarch_deprecated_saved_pc_after_call (gdbarch, hppa_saved_pc_after_call); -- set_gdbarch_deprecated_init_frame_pc (gdbarch, deprecated_init_frame_pc_default); -- set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, hppa_frame_init_saved_regs); -- set_gdbarch_deprecated_init_extra_frame_info (gdbarch, hppa_init_extra_frame_info); -- set_gdbarch_deprecated_frame_chain (gdbarch, hppa_frame_chain); -- set_gdbarch_deprecated_frame_chain_valid (gdbarch, hppa_frame_chain_valid); -- set_gdbarch_deprecated_frameless_function_invocation (gdbarch, hppa_frameless_function_invocation); -- set_gdbarch_deprecated_frame_saved_pc (gdbarch, hppa_frame_saved_pc); -- set_gdbarch_deprecated_pop_frame (gdbarch, hppa_pop_frame); -- break; -- default: -- internal_error (__FILE__, __LINE__, "bad switch"); -- } -+ set_gdbarch_unwind_dummy_id (gdbarch, hppa_unwind_dummy_id); -+ set_gdbarch_unwind_pc (gdbarch, hppa_unwind_pc); -+ frame_unwind_append_sniffer (gdbarch, hppa_frame_unwind_sniffer); -+ frame_base_append_sniffer (gdbarch, hppa_frame_base_sniffer); - - /* Hook in ABI-specific overrides, if they have been registered. */ - gdbarch_init_osabi (info, gdbarch); diff --git a/sys-devel/gdb/gdb-6.1.1.ebuild b/sys-devel/gdb/gdb-6.1.1.ebuild index 0f63986d007d..cf1e434f6240 100644 --- a/sys-devel/gdb/gdb-6.1.1.ebuild +++ b/sys-devel/gdb/gdb-6.1.1.ebuild @@ -1,12 +1,13 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/sys-devel/gdb/gdb-6.1.1.ebuild,v 1.6 2004/08/03 04:01:58 vapier Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-devel/gdb/gdb-6.1.1.ebuild,v 1.7 2004/08/03 04:44:55 vapier Exp $ inherit flag-o-matic eutils DESCRIPTION="GNU debugger" HOMEPAGE="http://sources.redhat.com/gdb/" -SRC_URI="http://mirrors.rcn.net/pub/sourceware/gdb/releases/${P}.tar.bz2" +SRC_URI="http://mirrors.rcn.net/pub/sourceware/gdb/releases/${P}.tar.bz2 + mirror://gentoo/gdb-6.1-hppa-01.patch.bz2" LICENSE="GPL-2 LGPL-2" SLOT="0" @@ -20,9 +21,8 @@ src_unpack() { unpack ${A} cd ${S} epatch ${FILESDIR}/gdb-6.1-ppc64-01.patch - epatch ${FILESDIR}/gdb-6.1-hppa-01.patch + epatch ${WORKDIR}/gdb-6.1-hppa-01.patch epatch ${FILESDIR}/gdb-6.1-uclibc.patch - } src_compile() { diff --git a/sys-devel/gdb/gdb-6.1.ebuild b/sys-devel/gdb/gdb-6.1.ebuild index 5d6fbbfe8e65..4273f5b8416f 100644 --- a/sys-devel/gdb/gdb-6.1.ebuild +++ b/sys-devel/gdb/gdb-6.1.ebuild @@ -1,12 +1,13 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/sys-devel/gdb/gdb-6.1.ebuild,v 1.7 2004/07/28 07:01:48 solar Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-devel/gdb/gdb-6.1.ebuild,v 1.8 2004/08/03 04:44:55 vapier Exp $ inherit flag-o-matic eutils DESCRIPTION="GNU debugger" HOMEPAGE="http://sources.redhat.com/gdb/" -SRC_URI="http://mirrors.rcn.net/pub/sourceware/gdb/releases/${P}.tar.bz2" +SRC_URI="http://mirrors.rcn.net/pub/sourceware/gdb/releases/${P}.tar.bz2 + mirror://gentoo/gdb-6.1-hppa-01.patch.bz2" LICENSE="GPL-2 LGPL-2" SLOT="0" @@ -20,7 +21,7 @@ src_unpack() { unpack ${A} cd ${S} epatch ${FILESDIR}/gdb-6.1-ppc64-01.patch - epatch ${FILESDIR}/gdb-6.1-hppa-01.patch + epatch ${WORKDIR}/gdb-6.1-hppa-01.patch epatch ${FILESDIR}/gdb-6.1-uclibc.patch } |