* [PATCH] more m68k multi-arch
@ 2002-06-24 10:10 Grace Sainsbury
2002-06-28 11:04 ` Kevin Buettner
0 siblings, 1 reply; 4+ messages in thread
From: Grace Sainsbury @ 2002-06-24 10:10 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1025 bytes --]
Here's some more m68k multi-arch stuff. I'll commit it unless someone objects.
Sorry about the earlier typo.
grace
ChangeLog:
2002-06-24 Grace Sainsbury <graces@redhat.com>
* config/m68k/tm-m68k.h (DECR_PC_AFTER_BREAK): Remove.
(REGISTER_BYTES_OK): Remove.
(REGISTER_BYTES): Remove.
(STORE_STRUCT_RETURN): Remove.
(DEPRECATED_EXTRACT_RETURN_VALUE): Remove.
(STORE_RETURN_VALUE): Remove.
(DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS): Remove.
(FRAME_CHAIN): Remove.
(FRAMELESS_FUNCTION_INVOCATION): Remove.
(FRAME_SAVED_PC): Remove.
* m68k-tdep.c (m68k_register_bytes_ok): Add.
(m68k_store_struct_return): Add.
(m68k_deprecated_extract_return_value): Add.
(m68k_deprecated_extract_struct_value_address): Add.
(m68k_store_return_value): Add.
(m68k_frame_chain): Add.
(m68k_frameless_function_invocation): Add.
(m68k_frame_saved_pc): Add.
(m68k_gdbarch_init): added set_gdbarch calls for new
functions and deleted macros.
[-- Attachment #2: m68k_4.patch --]
[-- Type: text/plain, Size: 8997 bytes --]
Index: m68k-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/m68k-tdep.c,v
retrieving revision 1.19
diff -u -r1.19 m68k-tdep.c
--- m68k-tdep.c 21 Jun 2002 20:23:24 -0000 1.19
+++ m68k-tdep.c 24 Jun 2002 17:03:35 -0000
@@ -44,6 +44,13 @@
void m68k_frame_init_saved_regs (struct frame_info *frame_info);
+static int
+m68k_register_bytes_ok (numbytes)
+{
+ return ((numbytes == REGISTER_BYTES_FP)
+ || (numbytes == REGISTER_BYTES_NOFP));
+}
+
/* Number of bytes of storage in the actual machine representation
for register regnum. On the 68000, all regs are 4 bytes
except the floating point regs which are 12 bytes. */
@@ -130,6 +137,101 @@
return (regnum * 4);
}
+/* Store the address of the place in which to copy the structure the
+ subroutine will return. This is called from call_function. */
+
+static void
+m68k_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
+{
+ write_register (A1_REGNUM, addr);
+}
+
+/* Extract from an array regbuf containing the (raw) register state
+ a function return value of type type, and copy that, in virtual format,
+ into valbuf. This is assuming that floating point values are returned
+ as doubles in d0/d1. */
+
+static void
+m68k_deprecated_extract_return_value (struct type *type, char *regbuf,
+ char *valbuf)
+{
+ int offset = 0;
+ int typeLength = TYPE_LENGTH (type);
+
+ if (typeLength < 4)
+ offset = 4 - typeLength;
+
+ memcpy (valbuf, regbuf + offset, typeLength);
+}
+
+static CORE_ADDR
+m68k_deprecated_extract_struct_value_address (char *regbuf)
+{
+ return (*(CORE_ADDR *) (regbuf));
+}
+
+/* Write into appropriate registers a function return value
+ of type TYPE, given in virtual format. Assumes floats are passed
+ in d0/d1. */
+
+static void
+m68k_store_return_value (struct type *type, char *valbuf)
+{
+ write_register_bytes (0, valbuf, TYPE_LENGTH (type));
+}
+
+/* Describe the pointer in each stack frame to the previous stack frame
+ (its caller). */
+
+/* FRAME_CHAIN takes a frame's nominal address and produces the frame's
+ chain-pointer.
+ In the case of the 68000, the frame's nominal address
+ is the address of a 4-byte word containing the calling frame's address. */
+
+/* If we are chaining from sigtramp, then manufacture a sigtramp frame
+ (which isn't really on the stack. I'm not sure this is right for anything
+ but BSD4.3 on an hp300. */
+
+static CORE_ADDR
+m68k_frame_chain (struct frame_info *thisframe)
+{
+ if (thisframe->signal_handler_caller)
+ return thisframe->frame;
+ else if (!inside_entry_file ((thisframe)->pc))
+ return read_memory_integer ((thisframe)->frame, 4);
+ else
+ return 0;
+}
+
+/* A function that tells us whether the function invocation represented
+ by fi does not have a frame on the stack associated with it. If it
+ does not, FRAMELESS is set to 1, else 0. */
+
+static int
+m68k_frameless_function_invocation (struct frame_info *fi)
+{
+ if (fi->signal_handler_caller)
+ return 0;
+ else
+ return frameless_look_for_prologue (fi);
+}
+
+static CORE_ADDR
+m68k_frame_saved_pc (struct frame_info *frame)
+{
+ if (frame->signal_handler_caller)
+ {
+ if (frame->next)
+ return read_memory_integer (frame->next->frame + SIG_PC_FP_OFFSET, 4);
+ else
+ return read_memory_integer (read_register (SP_REGNUM)
+ + SIG_PC_FP_OFFSET - 8, 4);
+ }
+ else
+ return read_memory_integer (frame->frame + 4, 4);
+}
+
+
/* The only reason this is here is the tm-altos.h reference below. It
was moved back here from tm-m68k.h. FIXME? */
@@ -830,6 +932,19 @@
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
set_gdbarch_stack_align (gdbarch, m68k_stack_align);
+ set_gdbarch_decr_pc_after_break (gdbarch, 2);
+
+ set_gdbarch_store_struct_return (gdbarch, m68k_store_struct_return);
+ set_gdbarch_deprecated_extract_return_value (gdbarch,
+ m68k_deprecated_extract_return_value);
+ set_gdbarch_store_return_value (gdbarch, m68k_store_return_value);
+
+ set_gdbarch_frame_chain (gdbarch, m68k_frame_chain);
+ set_gdbarch_frame_saved_pc (gdbarch, m68k_frame_saved_pc);
+ set_gdbarch_frame_init_saved_regs (gdbarch, m68k_frame_init_saved_regs);
+ set_gdbarch_frameless_function_invocation (gdbarch,
+ m68k_frameless_function_invocation);
+
set_gdbarch_register_raw_size (gdbarch, m68k_register_raw_size);
set_gdbarch_register_virtual_size (gdbarch, m68k_register_virtual_size);
set_gdbarch_max_register_raw_size (gdbarch, 12);
@@ -838,8 +953,9 @@
set_gdbarch_register_name (gdbarch, m68k_register_name);
set_gdbarch_register_size (gdbarch, 4);
set_gdbarch_register_byte (gdbarch, m68k_register_byte);
-
- set_gdbarch_frame_init_saved_regs (gdbarch, m68k_frame_init_saved_regs);
+ set_gdbarch_num_regs (gdbarch, 29);
+ set_gdbarch_register_bytes_ok (gdbarch, m68k_register_bytes_ok);
+ set_gdbarch_register_bytes (gdbarch, (16 * 4 + 8 + 8 * 12 + 3 * 4));
set_gdbarch_use_generic_dummy_frames (gdbarch, 0);
set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
Index: config/m68k/tm-m68k.h
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/tm-m68k.h,v
retrieving revision 1.15
diff -u -r1.15 tm-m68k.h
--- config/m68k/tm-m68k.h 22 Jun 2002 00:33:56 -0000 1.15
+++ config/m68k/tm-m68k.h 24 Jun 2002 17:03:35 -0000
@@ -95,9 +95,11 @@
/* If your kernel resets the pc after the trap happens you may need to
define this before including this file. */
+#if !GDB_MULTI_ARCH
#if !defined (DECR_PC_AFTER_BREAK)
#define DECR_PC_AFTER_BREAK 2
#endif
+#endif
/* Say how long (ordinary) registers are. This is a piece of bogosity
used in push_word and a few other places; REGISTER_RAW_SIZE is the
@@ -110,12 +112,15 @@
#define REGISTER_BYTES_FP (16*4 + 8 + 8*12 + 3*4)
#define REGISTER_BYTES_NOFP (16*4 + 8)
+
#ifndef NUM_REGS
#define NUM_REGS 29
#endif
+
#define NUM_FREGS (NUM_REGS-24)
+#if !GDB_MULTI_ARCH
#ifndef REGISTER_BYTES_OK
#define REGISTER_BYTES_OK(b) \
((b) == REGISTER_BYTES_FP \
@@ -125,6 +130,7 @@
#ifndef REGISTER_BYTES
#define REGISTER_BYTES (16*4 + 8 + 8*12 + 3*4)
#endif
+#endif //multi-arch
/* Index within `registers' of the first byte of the space for
register N. */
@@ -157,7 +163,8 @@
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
#define MAX_REGISTER_VIRTUAL_SIZE 12
-#endif
+#endif //multi-arch
+
/* Return the GDB type object for the "standard" data type of data
in register N. This should be int for D0-D7, long double for FP0-FP7,
and void pointer for all others (A0-A7, PC, SR, FPCONTROL etc).
@@ -205,7 +212,7 @@
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function. */
-
+#if !GDB_MULTI_ARCH
#define STORE_STRUCT_RETURN(ADDR, SP) \
{ write_register (A1_REGNUM, (ADDR)); }
@@ -221,11 +228,13 @@
(TYPE_LENGTH(TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH(TYPE)), \
TYPE_LENGTH(TYPE))
#endif
+#endif //multi-arch
/* Write into appropriate registers a function return value
of type TYPE, given in virtual format. Assumes floats are passed
in d0/d1. */
+#if !GDB_MULTI_ARCH
#if !defined (STORE_RETURN_VALUE)
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE))
@@ -236,6 +245,7 @@
as a CORE_ADDR (or an expression that can be used as one). */
#define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
+#endif //multi-arch
\f
/* Describe the pointer in each stack frame to the previous stack frame
(its caller). */
@@ -248,20 +258,24 @@
/* If we are chaining from sigtramp, then manufacture a sigtramp frame
(which isn't really on the stack. I'm not sure this is right for anything
but BSD4.3 on an hp300. */
+#if !GDB_MULTI_ARCH
#define FRAME_CHAIN(thisframe) \
(thisframe->signal_handler_caller \
? thisframe->frame \
: (!inside_entry_file ((thisframe)->pc) \
? read_memory_integer ((thisframe)->frame, 4) \
: 0))
+#endif
/* Define other aspects of the stack frame. */
/* A macro that tells us whether the function invocation represented
by FI does not have a frame on the stack associated with it. If it
does not, FRAMELESS is set to 1, else 0. */
+#if !GDB_MULTI_ARCH
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
(((FI)->signal_handler_caller) ? 0 : frameless_look_for_prologue(FI))
+#endif
/* This was determined by experimentation on hp300 BSD 4.3. Perhaps
it corresponds to some offset in /usr/include/sys/user.h or
@@ -272,6 +286,7 @@
#define SIG_PC_FP_OFFSET 530
+#if !GDB_MULTI_ARCH
#define FRAME_SAVED_PC(FRAME) \
(((FRAME)->signal_handler_caller \
? ((FRAME)->next \
@@ -281,6 +296,7 @@
) \
: read_memory_integer ((FRAME)->frame + 4, 4)) \
)
+#endif
#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] more m68k multi-arch
2002-06-24 10:10 [PATCH] more m68k multi-arch Grace Sainsbury
@ 2002-06-28 11:04 ` Kevin Buettner
2002-06-28 11:27 ` Kevin Buettner
0 siblings, 1 reply; 4+ messages in thread
From: Kevin Buettner @ 2002-06-28 11:04 UTC (permalink / raw)
To: Grace Sainsbury, gdb-patches
On Jun 24, 1:10pm, Grace Sainsbury wrote:
> +#if !GDB_MULTI_ARCH
> #define STORE_STRUCT_RETURN(ADDR, SP) \
> { write_register (A1_REGNUM, (ADDR)); }
>
> @@ -221,11 +228,13 @@
> (TYPE_LENGTH(TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH(TYPE)), \
> TYPE_LENGTH(TYPE))
> #endif
> +#endif //multi-arch
I've noticed the addition of a number of ``#if !GDB_MULTI_ARCH''
statements in your patch. Presumably, these are temporary until
you finish the job, right? (I'm wondering if it's necessary to
keep them around at all.)
Also... be careful with // comments. While these do work with gcc,
they don't work with all C compilers, so use /* ... */ instead.
Kevin
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] more m68k multi-arch
2002-06-28 11:04 ` Kevin Buettner
@ 2002-06-28 11:27 ` Kevin Buettner
2002-07-10 16:04 ` Andrew Cagney
0 siblings, 1 reply; 4+ messages in thread
From: Kevin Buettner @ 2002-06-28 11:27 UTC (permalink / raw)
To: Grace Sainsbury, gdb-patches
On Jun 28, 11:03am, Kevin Buettner wrote:
> On Jun 24, 1:10pm, Grace Sainsbury wrote:
>
> > +#if !GDB_MULTI_ARCH
> > #define STORE_STRUCT_RETURN(ADDR, SP) \
> > { write_register (A1_REGNUM, (ADDR)); }
> >
> > @@ -221,11 +228,13 @@
> > (TYPE_LENGTH(TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH(TYPE)), \
> > TYPE_LENGTH(TYPE))
> > #endif
> > +#endif //multi-arch
>
> I've noticed the addition of a number of ``#if !GDB_MULTI_ARCH''
> statements in your patch. Presumably, these are temporary until
> you finish the job, right? (I'm wondering if it's necessary to
> keep them around at all.)
I've been looking at this some more...
I've noticed the following define near the top of tm-m68k.h:
#define GDB_MULTI_ARCH 0
Clearly, with this definition in place, you do need to keep the old
definitions around, because those are the ones that will be used!
It seems to me that your testing will be more productive if you do
one of the following:
1) define GDB_MULTI_ARCH to be GDB_MULTI_ARCH_PARTIAL (1) instead of 0.
or
2) change the macro definitions being replaced to instead refer to
the newly defined functions in m68k-tdep.c.
As it stands now, you are only testing that the functions that you've
added to the tdep.c file build (i.e. compile), but GDB won't actually
be using them. This means that if you make a typo, it won't be
noticed until some later point when GDB_MULTI_ARCH is changed from 0
to some other value.
Kevin
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] more m68k multi-arch
2002-06-28 11:27 ` Kevin Buettner
@ 2002-07-10 16:04 ` Andrew Cagney
0 siblings, 0 replies; 4+ messages in thread
From: Andrew Cagney @ 2002-07-10 16:04 UTC (permalink / raw)
To: Kevin Buettner; +Cc: Grace Sainsbury, gdb-patches
> On Jun 28, 11:03am, Kevin Buettner wrote:
Kevin,
See:
http://sources.redhat.com/gdb/current/onlinedocs/gdbint_9.html#SEC82
> 9.11.4 Prepare for multi-arch level to one
>
> Temporally set GDB_MULTI_ARCH to GDB_MULTI_ARCH_PARTIAL and then build and start GDB (the change should not be committed). GDB may not build, and once built, it may die with an internal error listing the architecture methods that must be provided.
>
> Fix any build problems (patch(es)).
>
> Convert all the architecture methods listed, which are only macros, into functions (patch(es)).
>
> Update arch_gdbarch_init to set all the missing architecture methods and wrap the corresponding macros in #if !GDB_MULTI_ARCH (patch(es)).
The presence of #define GDB_MULTI_ARCH 0 indicates that this is being
tested.
enjoy,
Andrew
> I've been looking at this some more...
>
> I've noticed the following define near the top of tm-m68k.h:
>
> #define GDB_MULTI_ARCH 0
>
> Clearly, with this definition in place, you do need to keep the old
> definitions around, because those are the ones that will be used!
>
> It seems to me that your testing will be more productive if you do
> one of the following:
>
> 1) define GDB_MULTI_ARCH to be GDB_MULTI_ARCH_PARTIAL (1) instead of 0.
>
> or
>
> 2) change the macro definitions being replaced to instead refer to
> the newly defined functions in m68k-tdep.c.
>
> As it stands now, you are only testing that the functions that you've
> added to the tdep.c file build (i.e. compile), but GDB won't actually
> be using them. This means that if you make a typo, it won't be
> noticed until some later point when GDB_MULTI_ARCH is changed from 0
> to some other value.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2002-07-10 22:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-06-24 10:10 [PATCH] more m68k multi-arch Grace Sainsbury
2002-06-28 11:04 ` Kevin Buettner
2002-06-28 11:27 ` Kevin Buettner
2002-07-10 16:04 ` Andrew Cagney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox