* Makefile (m68klinux-nat.o, m68klinux-tdep.o): Update

dependencies.
	* config/m68k/tm-linux.h (DEPRECATED_EXTRACT_RETURN_VALUE): Define
	as m68k_linux_extract_return_value.
	(DEPRECATED_STORE_RETURN_VALUE): Define as
	m68k_linux_store_return_value.
	(DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS): Define as
	m68k_linux_extract_struct_value_address.
	* m68klinux-tdep.c (m68k_linux_sigtramp_saved_pc): Use
	get_next_frame, get_frame_base, get_frame_pc.
	(m68k_linux_frame_saved_pc): Use get_frame_base.
	(m68k_linux_extract_return_value): New function.
	(m68k_linux_store_return_value): New function.
	(m68k_linux_extract_struct_value_address): New function.
	* config/m68k/tm-m68k.h: Declare m68k_get_longjmp_target.
This commit is contained in:
Andreas Schwab
2003-05-18 21:10:11 +00:00
parent 55baeb8469
commit d0b45d99e8
5 changed files with 84 additions and 52 deletions

View File

@ -1,5 +1,21 @@
2003-05-18 Andreas Schwab <schwab@suse.de> 2003-05-18 Andreas Schwab <schwab@suse.de>
* Makefile (m68klinux-nat.o, m68klinux-tdep.o): Update
dependencies.
* config/m68k/tm-linux.h (DEPRECATED_EXTRACT_RETURN_VALUE): Define
as m68k_linux_extract_return_value.
(DEPRECATED_STORE_RETURN_VALUE): Define as
m68k_linux_store_return_value.
(DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS): Define as
m68k_linux_extract_struct_value_address.
* m68klinux-tdep.c (m68k_linux_sigtramp_saved_pc): Use
get_next_frame, get_frame_base, get_frame_pc.
(m68k_linux_frame_saved_pc): Use get_frame_base.
(m68k_linux_extract_return_value): New function.
(m68k_linux_store_return_value): New function.
(m68k_linux_extract_struct_value_address): New function.
* config/m68k/tm-m68k.h: Declare m68k_get_longjmp_target.
* c-exp.y (typebase): Remove duplicate occurence of * c-exp.y (typebase): Remove duplicate occurence of
`SIGNED_KEYWORD LONG LONG'. Use builtin_type_long_long instead `SIGNED_KEYWORD LONG LONG'. Use builtin_type_long_long instead
of lookup_signed_typename. of lookup_signed_typename.

View File

@ -1920,10 +1920,10 @@ m68k-tdep.o: m68k-tdep.c $(defs_h) $(frame_h) $(symtab_h) $(gdbcore_h) \
$(value_h) $(gdb_string_h) $(inferior_h) $(regcache_h) \ $(value_h) $(gdb_string_h) $(inferior_h) $(regcache_h) \
$(arch_utils_h) $(gregset_h) $(m68k_tdep_h) $(arch_utils_h) $(gregset_h) $(m68k_tdep_h)
m68klinux-nat.o: m68klinux-nat.c $(defs_h) $(frame_h) $(inferior_h) \ m68klinux-nat.o: m68klinux-nat.c $(defs_h) $(frame_h) $(inferior_h) \
$(language_h) $(gdbcore_h) $(regcache_h) $(gdb_stat_h) \ $(language_h) $(gdbcore_h) $(gdb_string_h) $(regcache_h) \
$(floatformat_h) $(target_h) $(gregset_h) $(m68k_tdep_h) $(m68k_tdep_h) $(gdb_stat_h) $(floatformat_h) $(target_h)
m68klinux-tdep.o: m68klinux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \ m68klinux-tdep.o: m68klinux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
$(target_h) $(target_h) $(gdb_string_h) $(gdbtypes_h) $(m68k_tdep_t)
m68knbsd-nat.o: m68knbsd-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \ m68knbsd-nat.o: m68knbsd-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
$(regcache_h) $(regcache_h)
m68knbsd-tdep.o: m68knbsd-tdep.c $(defs_h) $(gdbtypes_h) $(regcache_h) m68knbsd-tdep.o: m68knbsd-tdep.c $(defs_h) $(gdbtypes_h) $(regcache_h)

View File

@ -1,6 +1,6 @@
/* Definitions to target GDB to GNU/Linux on m680x0. /* Definitions to target GDB to GNU/Linux on m680x0.
Copyright 1996, 1998, 1999, 2000, 2002 Free Software Foundation, Copyright 1996, 1998, 1999, 2000, 2002, 2003 Free Software Foundation,
Inc. Inc.
This file is part of GDB. This file is part of GDB.
@ -20,8 +20,10 @@
Foundation, Inc., 59 Temple Place - Suite 330, Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include "config/tm-linux.h"
#include "m68k/tm-m68k.h"
#include "regcache.h" #include "regcache.h"
#include "m68k-tdep.h"
/* Number of traps that happen between exec'ing the shell to run an /* Number of traps that happen between exec'ing the shell to run an
inferior, and when we finally get to the inferior code. This is 2 inferior, and when we finally get to the inferior code. This is 2
@ -37,56 +39,24 @@
function return value of type TYPE, and copy that, in virtual function return value of type TYPE, and copy that, in virtual
format, into VALBUF. */ format, into VALBUF. */
#define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \ #define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
{ \ m68k_linux_extract_return_value (TYPE, REGBUF, VALBUF)
if (TYPE_CODE (TYPE) == TYPE_CODE_FLT) \ extern void m68k_linux_extract_return_value (struct type *, char *, char *);
{ \
REGISTER_CONVERT_TO_VIRTUAL (FP0_REGNUM, TYPE, \
((char *) (REGBUF) \
+ REGISTER_BYTE (FP0_REGNUM)), \
VALBUF); \
} \
else if (TYPE_CODE (TYPE) == TYPE_CODE_PTR) \
memcpy (VALBUF, (char *) (REGBUF) + REGISTER_BYTE (M68K_A0_REGNUM), \
TYPE_LENGTH (TYPE)); \
else \
memcpy (VALBUF, \
((char *) (REGBUF) \
+ (TYPE_LENGTH (TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH (TYPE))), \
TYPE_LENGTH (TYPE)); \
}
/* Write into appropriate registers a function return value of type /* Write into appropriate registers a function return value of type
TYPE, given in virtual format. */ TYPE, given in virtual format. */
#define DEPRECATED_STORE_RETURN_VALUE(TYPE,VALBUF) \ #define DEPRECATED_STORE_RETURN_VALUE(TYPE, VALBUF) \
{ \ m68k_linux_store_return_value (TYPE, VALBUF)
if (TYPE_CODE (TYPE) == TYPE_CODE_FLT) \ extern void m68k_linux_store_return_value (struct type *, char *);
{ \
char raw_buffer[REGISTER_RAW_SIZE (FP0_REGNUM)]; \
REGISTER_CONVERT_TO_RAW (TYPE, FP0_REGNUM, VALBUF, raw_buffer); \
deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM), \
raw_buffer, TYPE_LENGTH (TYPE)); \
} \
else \
{ \
if (TYPE_CODE (TYPE) == TYPE_CODE_PTR) \
deprecated_write_register_bytes (REGISTER_BYTE (M68K_A0_REGNUM), VALBUF, \
TYPE_LENGTH (TYPE)); \
deprecated_write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE)); \
} \
}
#include "config/tm-linux.h"
#include "m68k/tm-m68k.h"
/* Extract from an array REGBUF containing the (raw) register state /* Extract from an array REGBUF containing the (raw) register state
the address in which a function should return its structure value, the address in which a function should return its structure value,
as a CORE_ADDR (or an expression that can be used as one). */ as a CORE_ADDR (or an expression that can be used as one). */
#undef DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS
#define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \ #define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
(*(CORE_ADDR *)((char *) (REGBUF) + REGISTER_BYTE (M68K_A0_REGNUM))) m68k_linux_extract_struct_value_address (REGBUF)
extern CORE_ADDR m68k_linux_extract_struct_value_address (char *);
/* Offsets (in target ints) into jmp_buf. */ /* Offsets (in target ints) into jmp_buf. */
@ -100,7 +70,6 @@
#define GET_LONGJMP_TARGET(ADDR) m68k_get_longjmp_target(ADDR) #define GET_LONGJMP_TARGET(ADDR) m68k_get_longjmp_target(ADDR)
#undef DEPRECATED_FRAME_SAVED_PC
#define DEPRECATED_FRAME_SAVED_PC(frame) m68k_linux_frame_saved_pc (frame) #define DEPRECATED_FRAME_SAVED_PC(frame) m68k_linux_frame_saved_pc (frame)
extern CORE_ADDR m68k_linux_frame_saved_pc (struct frame_info *); extern CORE_ADDR m68k_linux_frame_saved_pc (struct frame_info *);

View File

@ -22,3 +22,5 @@
#include "regcache.h" #include "regcache.h"
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL #define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL
extern int m68k_get_longjmp_target (CORE_ADDR *);

View File

@ -1,6 +1,6 @@
/* Motorola m68k target-dependent support for GNU/Linux. /* Motorola m68k target-dependent support for GNU/Linux.
Copyright 1996, 1998, 2000, 2001, 2002 Free Software Foundation, Copyright 1996, 1998, 2000, 2001, 2002, 2003 Free Software Foundation,
Inc. Inc.
This file is part of GDB. This file is part of GDB.
@ -24,7 +24,9 @@
#include "gdbcore.h" #include "gdbcore.h"
#include "frame.h" #include "frame.h"
#include "target.h" #include "target.h"
#include "gdb_string.h"
#include "gdbtypes.h"
#include "m68k-tdep.h"
/* Check whether insn1 and insn2 are parts of a signal trampoline. */ /* Check whether insn1 and insn2 are parts of a signal trampoline. */
@ -93,9 +95,9 @@ m68k_linux_sigtramp_saved_pc (struct frame_info *frame)
int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT; int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT;
/* Get sigcontext address, it is the third parameter on the stack. */ /* Get sigcontext address, it is the third parameter on the stack. */
if (frame->next) if (get_next_frame (frame))
sigcontext_addr sigcontext_addr
= read_memory_unsigned_integer (FRAME_ARGS_ADDRESS (frame->next) = read_memory_unsigned_integer (get_frame_base (get_next_frame (frame))
+ FRAME_ARGS_SKIP + FRAME_ARGS_SKIP
+ sigcontext_offs, + sigcontext_offs,
ptrbytes); ptrbytes);
@ -107,7 +109,7 @@ m68k_linux_sigtramp_saved_pc (struct frame_info *frame)
/* Don't cause a memory_error when accessing sigcontext in case the /* Don't cause a memory_error when accessing sigcontext in case the
stack layout has changed or the stack is corrupt. */ stack layout has changed or the stack is corrupt. */
if (m68k_linux_in_sigtramp (frame->pc) == 2) if (m68k_linux_in_sigtramp (get_frame_pc (frame)) == 2)
target_read_memory (sigcontext_addr + UCONTEXT_PC_OFFSET, buf, ptrbytes); target_read_memory (sigcontext_addr + UCONTEXT_PC_OFFSET, buf, ptrbytes);
else else
target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes); target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
@ -122,5 +124,48 @@ m68k_linux_frame_saved_pc (struct frame_info *frame)
if (get_frame_type (frame) == SIGTRAMP_FRAME) if (get_frame_type (frame) == SIGTRAMP_FRAME)
return m68k_linux_sigtramp_saved_pc (frame); return m68k_linux_sigtramp_saved_pc (frame);
return read_memory_unsigned_integer (frame->frame + 4, 4); return read_memory_unsigned_integer (get_frame_base (frame) + 4, 4);
}
void
m68k_linux_extract_return_value (struct type *type, char *regbuf, char *valbuf)
{
if (TYPE_CODE (type) == TYPE_CODE_FLT)
{
REGISTER_CONVERT_TO_VIRTUAL (FP0_REGNUM, type,
regbuf + REGISTER_BYTE (FP0_REGNUM),
valbuf);
}
else if (TYPE_CODE (type) == TYPE_CODE_PTR)
memcpy (valbuf, regbuf + REGISTER_BYTE (M68K_A0_REGNUM),
TYPE_LENGTH (type));
else
memcpy (valbuf,
regbuf + (TYPE_LENGTH (type) >= 4 ? 0 : 4 - TYPE_LENGTH (type)),
TYPE_LENGTH (type));
}
void
m68k_linux_store_return_value (struct type *type, char *valbuf)
{
if (TYPE_CODE (type) == TYPE_CODE_FLT)
{
char raw_buffer[REGISTER_RAW_SIZE (FP0_REGNUM)];
REGISTER_CONVERT_TO_RAW (type, FP0_REGNUM, valbuf, raw_buffer);
deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
raw_buffer, TYPE_LENGTH (type));
}
else
{
if (TYPE_CODE (type) == TYPE_CODE_PTR)
deprecated_write_register_bytes (REGISTER_BYTE (M68K_A0_REGNUM),
valbuf, TYPE_LENGTH (type));
deprecated_write_register_bytes (0, valbuf, TYPE_LENGTH (type));
}
}
CORE_ADDR
m68k_linux_extract_struct_value_address (char *regbuf)
{
return *(CORE_ADDR *) (regbuf + REGISTER_BYTE (M68K_A0_REGNUM));
} }