* Re: [PATCH][RFA]: sim/common: Cpu Frequence and Exec Time
[not found] ` <39934EEE.B60694AC@cygnus.com>
2000-08-11 10:10 ` [PATCH][RFA]: sim/common: Cpu Frequence and Exec Time Dave Brolley
@ 2000-08-16 8:20 ` Dave Brolley
1 sibling, 0 replies; 2+ messages in thread
From: Dave Brolley @ 2000-08-16 8:20 UTC (permalink / raw)
To: Andrew Cagney; +Cc: gdb-patches, Ben Elliston
Andrew Cagney wrote:
>
> Dave,
>
> The revised version of this patch is fine. Thanks for doing the
> testing.
OK thanks. I committed it. I've attached the patch again for
reference.
Dave
To : Andrew Cagney <ac131313 at cygnus dot com>
Subject : Re: [PATCH][RFA]: sim/common: Cpu Frequence and Exec Time
From : Dave Brolley <brolley at redhat dot com>
Date : Sat, 29 Jul 2000 17:09:29 -0400
CC : gdb-patches at sourceware dot cygnus dot com
Organization : Red Hat Canada, Inc
References : <39806B05.96F0DA12@redhat.com> <398104FD.8FB4ACBE@cygnus.com>
Andrew Cagney wrote:
>
> Dave,
>
> This doesn't compile on the mn10300 (PROFILE_MODEL_TOTAL_CYCLES is only
> defined when WITH_PROFILE_MODEL_P). When making changes to sim/common,
> it is a good idea to quickly re-compile (not test) a variant of each sim
> so that this sort of thing shows up.
OK -- Here's a revised patch. It adds confitional compilation for
WITH_PROFILE_MODEL_P and includes <ctype.h>. I built almost all
of the simulators successfully.
Dave
Index: sim-profile.c
===================================================================
RCS file: /cvs/src/src/sim/common/sim-profile.c,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 sim-profile.c
*** sim-profile.c 1999/12/22 21:45:38 1.1.1.2
--- sim-profile.c 2000/07/29 17:05:57
***************
*** 1,5 ****
/* Default profiling support.
! Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Cygnus Support.
This file is part of GDB, the GNU debugger.
--- 1,5 ----
/* Default profiling support.
! Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
Contributed by Cygnus Support.
This file is part of GDB, the GNU debugger.
*************** with this program; if not, write to the
*** 34,39 ****
--- 34,40 ----
#include <strings.h>
#endif
#endif
+ #include <ctype.h>
#define COMMAS(n) sim_add_commas (comma_buf, sizeof (comma_buf), (n))
*************** enum {
*** 48,53 ****
--- 49,55 ----
OPTION_PROFILE_MODEL,
OPTION_PROFILE_FILE,
OPTION_PROFILE_CORE,
+ OPTION_PROFILE_CPU_FREQUENCY,
OPTION_PROFILE_PC,
OPTION_PROFILE_PC_RANGE,
OPTION_PROFILE_PC_GRANULARITY,
*************** static const OPTION profile_options[] =
*** 71,76 ****
--- 73,82 ----
{ {"profile-model", optional_argument, NULL, OPTION_PROFILE_MODEL},
'\0', "on|off", "Perform model profiling",
profile_option_handler },
+ { {"profile-cpu-frequency", required_argument, NULL,
+ OPTION_PROFILE_CPU_FREQUENCY},
+ '\0', "CPU FREQUENCY", "Specify the speed of the simulated cpu clock",
+ profile_option_handler },
{ {"profile-file", required_argument, NULL, OPTION_PROFILE_FILE},
'\0', "FILE NAME", "Specify profile output file",
*************** sim_profile_set_option (SIM_DESC sd, con
*** 189,194 ****
--- 195,247 ----
}
static SIM_RC
+ parse_frequency (SIM_DESC sd, const char *arg, unsigned long *freq)
+ {
+ const char *ch;
+ /* First, parse a decimal number. */
+ *freq = 0;
+ ch = arg;
+ if (isdigit (*arg))
+ {
+ for (/**/; *ch != '\0'; ++ch)
+ {
+ if (! isdigit (*ch))
+ break;
+ *freq = *freq * 10 + (*ch - '0');
+ }
+
+ /* Accept KHz, MHz or Hz as a suffix. */
+ if (tolower (*ch) == 'm')
+ {
+ *freq *= 1000000;
+ ++ch;
+ }
+ else if (tolower (*ch) == 'k')
+ {
+ *freq *= 1000;
+ ++ch;
+ }
+
+ if (tolower (*ch) == 'h')
+ {
+ ++ch;
+ if (tolower (*ch) == 'z')
+ ++ch;
+ }
+ }
+
+ if (*ch != '\0')
+ {
+ sim_io_eprintf (sd, "Invalid argument for --profile-cpu-frequency: %s\n",
+ arg);
+ *freq = 0;
+ return SIM_RC_FAIL;
+ }
+
+ return SIM_RC_OK;
+ }
+
+ static SIM_RC
profile_option_handler (SIM_DESC sd,
sim_cpu *cpu,
int opt,
*************** profile_option_handler (SIM_DESC sd,
*** 237,242 ****
--- 290,307 ----
sim_io_eprintf (sd, "Model profiling not compiled in, `--profile-model' ignored\n");
break;
+ case OPTION_PROFILE_CPU_FREQUENCY :
+ {
+ unsigned long val;
+ SIM_RC rc = parse_frequency (sd, arg, &val);
+ if (rc == SIM_RC_OK)
+ {
+ for (cpu_nr = 0; cpu_nr < MAX_NR_PROCESSORS; ++cpu_nr)
+ PROFILE_CPU_FREQ (CPU_PROFILE_DATA (STATE_CPU (sd,cpu_nr))) = val;
+ }
+ return rc;
+ }
+
case OPTION_PROFILE_FILE :
/* FIXME: Might want this to apply to pc profiling only,
or have two profile file options. */
*************** profile_print_speed (sim_cpu *cpu)
*** 924,954 ****
PROFILE_DATA *data = CPU_PROFILE_DATA (cpu);
unsigned long milliseconds = sim_events_elapsed_time (sd);
unsigned long total = PROFILE_TOTAL_INSN_COUNT (data);
char comma_buf[20];
sim_io_printf (sd, "Simulator Execution Speed\n\n");
if (total != 0)
! sim_io_printf (sd, " Total instructions: %s\n", COMMAS (total));
if (milliseconds < 1000)
! sim_io_printf (sd, " Total execution time: < 1 second\n\n");
else
{
/* The printing of the time rounded to 2 decimal places makes the speed
calculation seem incorrect [even though it is correct]. So round
MILLISECONDS first. This can marginally affect the result, but it's
better that the user not perceive there's a math error. */
! double secs = (double) milliseconds / 1000;
secs = ((double) (unsigned long) (secs * 100 + .5)) / 100;
! sim_io_printf (sd, " Total execution time: %.2f seconds\n", secs);
/* Don't confuse things with data that isn't useful.
If we ran for less than 2 seconds, only use the data if we
executed more than 100,000 insns. */
if (secs >= 2 || total >= 100000)
! sim_io_printf (sd, " Simulator speed: %s insns/second\n\n",
COMMAS ((unsigned long) ((double) total / secs)));
}
}
/* Print selected address ranges. */
--- 989,1047 ----
PROFILE_DATA *data = CPU_PROFILE_DATA (cpu);
unsigned long milliseconds = sim_events_elapsed_time (sd);
unsigned long total = PROFILE_TOTAL_INSN_COUNT (data);
+ double clock;
+ double secs;
char comma_buf[20];
sim_io_printf (sd, "Simulator Execution Speed\n\n");
if (total != 0)
! sim_io_printf (sd, " Total instructions: %s\n", COMMAS (total));
if (milliseconds < 1000)
! sim_io_printf (sd, " Total execution time: < 1 second\n\n");
else
{
/* The printing of the time rounded to 2 decimal places makes the speed
calculation seem incorrect [even though it is correct]. So round
MILLISECONDS first. This can marginally affect the result, but it's
better that the user not perceive there's a math error. */
! secs = (double) milliseconds / 1000;
secs = ((double) (unsigned long) (secs * 100 + .5)) / 100;
! sim_io_printf (sd, " Total execution time : %.2f seconds\n", secs);
/* Don't confuse things with data that isn't useful.
If we ran for less than 2 seconds, only use the data if we
executed more than 100,000 insns. */
if (secs >= 2 || total >= 100000)
! sim_io_printf (sd, " Simulator speed: %s insns/second\n",
COMMAS ((unsigned long) ((double) total / secs)));
}
+
+ #if WITH_PROFILE_MODEL_P
+ /* Print simulated execution time if the cpu frequency has been specified. */
+ clock = PROFILE_CPU_FREQ (data);
+ if (clock != 0)
+ {
+ if (clock >= 1000000)
+ sim_io_printf (sd, " Simulated cpu frequency: %.2f MHz\n",
+ clock / 1000000);
+ else
+ sim_io_printf (sd, " Simulated cpu frequency: %.2f Hz\n", clock);
+
+ if (PROFILE_FLAGS (data) [PROFILE_MODEL_IDX])
+ {
+ /* The printing of the time rounded to 2 decimal places makes the
+ speed calculation seem incorrect [even though it is correct].
+ So round SECS first. This can marginally affect the result,
+ but it's better that the user not perceive there's a math
+ error. */
+ secs = PROFILE_MODEL_TOTAL_CYCLES (data) / clock;
+ secs = ((double) (unsigned long) (secs * 100 + .5)) / 100;
+ sim_io_printf (sd, " Simulated execution time: %.2f seconds\n",
+ secs);
+ }
+ }
+ #endif /* WITH_PROFILE_MODEL_P */
}
/* Print selected address ranges. */
Index: sim-profile.h
===================================================================
RCS file: /cvs/src/src/sim/common/sim-profile.h,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 sim-profile.h
*** sim-profile.h 1999/12/22 21:45:38 1.1.1.2
--- sim-profile.h 2000/07/29 17:05:57
*************** typedef struct {
*** 150,155 ****
--- 150,159 ----
unsigned long total_insn_count;
#define PROFILE_TOTAL_INSN_COUNT(p) ((p)->total_insn_count)
+ /* CPU frequency. Always accepted, regardless of profiling options. */
+ unsigned long cpu_freq;
+ #define PROFILE_CPU_FREQ(p) ((p)->cpu_freq)
+
#if WITH_PROFILE_INSN_P
unsigned int *insn_count;
#define PROFILE_INSN_COUNT(p) ((p)->insn_count)
From fnasser@cygnus.com Wed Aug 16 11:11:00 2000
From: Fernando Nasser <fnasser@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: On vacation until July 6th
Date: Wed, 16 Aug 2000 11:11:00 -0000
Message-id: <399ADAAC.985C7422@cygnus.com>
X-SW-Source: 2000-08/msg00257.html
Content-length: 443
Please contact the backup maintainers or the head maintainer if it is
urgent.
If you can wait 2-weeks, please wait until I come back. Thanks.
There are two things that I thought I would be able to post before
leaving but
that will have to wait: 1) The improved hardware watchpoint changes;
2) The revised patch to write_register_bytes()
Unfortunately they will have to wait a couple of weeks more.
--
Fernando Nasser
Red Hat Canada Ltd.
From fnasser@cygnus.com Wed Aug 16 12:29:00 2000
From: Fernando Nasser <fnasser@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: Re: On vacation until SEPTEMBER 6th
Date: Wed, 16 Aug 2000 12:29:00 -0000
Message-id: <399AECF0.BE8CFC50@cygnus.com>
References: <399ADAAC.985C7422@cygnus.com>
X-SW-Source: 2000-08/msg00258.html
Content-length: 276
Unfortunately, as someone pointed up, I won't be able to take my
11-month vacation
until July 6th at this time (I will continue playing the lottery
though...)
So, I will only be away for 2-weeks and come back Sept 6th (not July
6th)
--
Fernando Nasser
Red Hat Canada Ltd.
From sbjohnson@ozemail.com.au Wed Aug 16 17:09:00 2000
From: Steven Johnson <sbjohnson@ozemail.com.au>
To: gdb-patches@sourceware.cygnus.com
Subject: Patch to Command Hook Handling.
Date: Wed, 16 Aug 2000 17:09:00 -0000
Message-id: <399B2AA3.CA2C0245@ozemail.com.au>
X-SW-Source: 2000-08/msg00259.html
Content-length: 14206
Attached is a patch that achieves the following:
1. Removes a potential problem with hooks where a hook calling
it's hooked command will end up in recursion until GDB Segfaults.
2. Adds the "hookpost-" hook. This is similar to "hook-" except
the hook is run after the command and not before. "hookpost-"
and "hook-" are not mutually exclusive, they can both exist
simultaneously on the same command.
3. Adds a "hookpre-" this is the same as "hook-" but I added it
for clarity when using the post hook. There is code present,
such that if you use "hook-" on a command then "hookpre-" no
longer is valid and vice versa.
4. Updated gdb.texinfo section on hooks to document "hookpost-"
and "hookpre-".
By way of example, the following is now possible:
define hook-echo
echo We are in hook-echo\n
end
define hookpost-echo
echo We are in hookpost-echo\n
end
then when:
gdb> echo hello\n
is executed, the output is:
We are in hook-echo
hello
We are in hookpost-echo
Prior to this patch, hook-echo above would have caused GDB to crash with a
segfault.
Changelog for gdb:
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* Added "hookpost-" and "hookpre-" as an expansion on the original
hooking
of commands to GDB. A Hook may now be run "AFTER" execution of
command as
well as before.
* command.h - Changed cmd_list_element.hook and
cmd_list_element.hookee to
hook_pre and hookee_pre respectively. Added hook_post and
hookee_post to
cmd_list_element for the post hook command operation. Added hook_in
to command
so that an executing hook can be flagged to prevent recursion.
* command.c - Changed initilisation of cmd_list_element of hook and
hookee to
hook_pre and hookee_pre respectively. Added hook_post and
hookee_post to be
initialised as hook_pre and hokee_pre. Added ability to remove
hook_post, where
hooks where originally being handled. Changed any reference to
hook/hookee to
hook_pre/hookee_pre respectively. Initialise hook_in to state of
hook not running.
* infrun.c - Carried through structure changes of cmd_list_element of
hook/hookee to
hook_pre/hookee_pre respectively.
* top.c - Carried through structure changes of cmd_list_element of
hook/hookee to
hook_pre/hookee_pre respectively. Added ability to call post hook
after command
executes. Added ability for define command to detect and properly
set up post hook
declerations and prevent clashes in pre hook declerations between
hook- and hookpre-.
Checks hook_in and only runs a hook when not set. Appropriately sets
and clears
hook_in when hooks execute.
Changelog for gdb/doc
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* gdb.texinfo - Documented new post hook ability of GDB.
<<<----- PATCH STARTS HERE ----->>>
diff -C2 -r -b ../insight-5.0/gdb/command.c src/gdb/command.c
*** ../insight-5.0/gdb/command.c Fri Mar 24 09:43:19 2000
--- src/gdb/command.c Tue Aug 15 13:18:14 2000
***************
*** 115,119 ****
c->flags = 0;
c->replacement = NULL;
! c->hook = NULL;
c->prefixlist = NULL;
c->prefixname = NULL;
--- 115,121 ----
c->flags = 0;
c->replacement = NULL;
! c->hook_pre = NULL;
! c->hook_post = NULL;
! c->hook_in = 0;
c->prefixlist = NULL;
c->prefixname = NULL;
***************
*** 126,130 ****
c->enums = NULL;
c->user_commands = NULL;
! c->hookee = NULL;
c->cmd_pointer = NULL;
--- 128,133 ----
c->enums = NULL;
c->user_commands = NULL;
! c->hookee_pre = NULL;
! c->hookee_post = NULL;
c->cmd_pointer = NULL;
***************
*** 382,387 ****
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee)
! (*list)->hookee->hook = 0; /* Hook slips out of its mouth */
p = (*list)->next;
free ((PTR) * list);
--- 385,392 ----
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee_pre)
! (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
! if ((*list)->hookee_post)
! (*list)->hookee_post->hook_post = 0; /* Hook slips out of its butt */
p = (*list)->next;
free ((PTR) * list);
***************
*** 394,399 ****
if (STREQ (c->next->name, name))
{
! if (c->next->hookee)
! c->next->hookee->hook = 0; /* hooked cmd gets away. */
p = c->next->next;
free ((PTR) c->next);
--- 399,407 ----
if (STREQ (c->next->name, name))
{
! if (c->next->hookee_pre)
! c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
! if (c->next->hookee_post)
! c->next->hookee_post->hook_post = 0; /* remove post hook */
! /* (sorry, no suitable
fishing metaphore) */
p = c->next->next;
free ((PTR) c->next);
***************
*** 543,549 ****
help_list (cmdlist, "", c->class, stream);
! if (c->hook)
! fprintf_filtered (stream, "\nThis command has a hook defined: %s\n",
! c->hook->name);
}
--- 551,560 ----
help_list (cmdlist, "", c->class, stream);
! if (c->hook_pre)
! fprintf_filtered (stream, "\nThis command is run after : %s (pre
hook)\n",
! c->hook_pre->name);
! if (c->hook_post)
! fprintf_filtered (stream, "\nThis command is run before : %s (post
hook)\n",
! c->hook_post->name);
}
diff -C2 -r -b ../insight-5.0/gdb/command.h src/gdb/command.h
*** ../insight-5.0/gdb/command.h Wed Apr 12 04:28:57 2000
--- src/gdb/command.h Tue Aug 15 13:17:49 2000
***************
*** 151,155 ****
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook;
/* Nonzero identifies a prefix command. For them, the address
--- 151,162 ----
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook_pre;
!
! /* Hook for another command to be executed after this command. */
! struct cmd_list_element *hook_post;
!
! /* Flag that specifies if this command is already running it's hook. */
! /* Prevents the possibility of hook recursion. */
! int hook_in;
/* Nonzero identifies a prefix command. For them, the address
***************
*** 206,212 ****
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one,
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee;
/* Pointer to command that is aliased by this one, so the
--- 213,223 ----
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one, (by hook_pre)
! so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_pre;
!
! /* Pointer to command that is hooked by this one, (by hook_post)
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_post;
/* Pointer to command that is aliased by this one, so the
diff -C2 -r -b ../insight-5.0/gdb/doc/gdb.texinfo src/gdb/doc/gdb.texinfo
*** ../insight-5.0/gdb/doc/gdb.texinfo Fri May 12 20:30:39 2000
--- src/gdb/doc/gdb.texinfo Tue Aug 15 11:59:01 2000
***************
*** 11867,11870 ****
--- 11867,11881 ----
before that command.
+ A @emph{hook} may also be defined which is run after the command you
+ executed. Whenever you run the command @samp{foo}, if the user-defined
+ command @samp{hookpost-foo} exists, it is executed (with no arguments)
+ after that command. Post execution hooks may exist simultaneously with
+ Pre execution hooks, on the same command. To aid in script readability,
+ @samp{hookpre-foo} is also valid and performs the same operation as
+ @samp{hook-foo} documented above.
+
+ @c It would be nice if hookpost could be passed a parameter indicating
+ @c if the command it hooks executed properly or not.
+
@kindex stop@r{, a pseudo-command}
In addition, a pseudo-command, @samp{stop} exists. Defining
diff -C2 -r -b ../insight-5.0/gdb/infrun.c src/gdb/infrun.c
*** ../insight-5.0/gdb/infrun.c Thu Apr 20 21:00:29 2000
--- src/gdb/infrun.c Tue Aug 15 11:18:07 2000
***************
*** 3431,3437 ****
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook)
{
! catch_errors (hook_stop_stub, stop_command->hook,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
--- 3431,3437 ----
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook_pre)
{
! catch_errors (hook_stop_stub, stop_command->hook_pre,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
diff -C2 -r -b ../insight-5.0/gdb/top.c src/gdb/top.c
*** ../insight-5.0/gdb/top.c Thu Apr 13 02:46:03 2000
--- src/gdb/top.c Wed Aug 16 09:45:28 2000
***************
*** 1528,1534 ****
}
! /* If this command has been hooked, run the hook first. */
! if (c->hook)
! execute_user_command (c->hook, (char *) 0);
if (c->flags & DEPRECATED_WARN_USER)
--- 1528,1538 ----
}
! /* If this command has been pre-hooked, run the hook first. */
! if ((c->hook_pre) && (!c->hook_in))
! {
! c->hook_in = 1; /* Prevent recursive hooking */
! execute_user_command (c->hook_pre, (char *) 0);
! c->hook_in = 0; /* Allow hook to work again once it is complete */
! }
if (c->flags & DEPRECATED_WARN_USER)
***************
*** 1545,1548 ****
--- 1549,1561 ----
else
(*c->function.cfunc) (arg, from_tty & caution);
+
+ /* If this command has been post-hooked, run the hook last. */
+ if ((c->hook_post) && (!c->hook_in))
+ {
+ c->hook_in = 1; /* Prevent recursive hooking */
+ execute_user_command (c->hook_post, (char *) 0);
+ c->hook_in = 0; /* allow hook to work again once it is complete */
+ }
+
}
***************
*** 3063,3072 ****
int from_tty;
{
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *hookc = 0;
char *tem = comname;
! char tmpbuf[128];
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
validate_comname (comname);
--- 3076,3098 ----
int from_tty;
{
+ #define MAX_TMPBUF 128
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *oldc, *hookc = 0;
char *tem = comname;
! char *tem2;
! char tmpbuf[MAX_TMPBUF];
! int hook_type = 0; /* 0 = Not Hooked. 1 = Pre Hook, 2 = Post Hook */
! int hook_name_size = 0;
!
! #define NO_HOOK 0
! #define PRE_HOOK 1
! #define POST_HOOK 2
!
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
+ #define HOOK_PRE_STRING "hookpre-"
+ #define HOOK_PRE_LEN 8
+ #define HOOK_POST_STRING "hookpost-"
+ #define HOOK_POST_LEN 9
validate_comname (comname);
***************
*** 3093,3100 ****
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + HOOK_LEN;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + HOOK_LEN, hookc->name))
hookc = 0;
if (!hookc)
--- 3119,3171 ----
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
+ strncpy(tmpbuf,HOOK_PRE_STRING,MAX_TMPBUF);
+ strncat(tmpbuf,comname+HOOK_LEN,MAX_TMPBUF-HOOK_PRE_LEN);
+
+ tem2 = &tmpbuf[0];
+
+ oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
+
+ if (oldc && STREQ (tmpbuf, oldc->name))
+ {
+ error ("Can not define \"%s\"! \"%s\" has already been defined.",
comname, oldc->name);
+ }
+ else
+ {
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_LEN;
+ }
+
+ }
+ else if (!strncmp (comname, HOOK_PRE_STRING, HOOK_PRE_LEN))
+ {
+ strncpy(tmpbuf,HOOK_STRING,MAX_TMPBUF);
+ strncat(tmpbuf,comname+HOOK_PRE_LEN,MAX_TMPBUF-HOOK_LEN);
+
+ tem2 = &tmpbuf[0];
+
+ oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
+
+ if (oldc && STREQ (tmpbuf, oldc->name))
+ {
+ error ("Can not define \"%s\"! \"%s\" has already been defined.",
comname, oldc->name);
+ }
+ else
+ {
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_PRE_LEN;
+ }
+ }
+ else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN))
+ {
+ hook_type = POST_HOOK;
+ hook_name_size = HOOK_POST_LEN;
+ }
+
+ if (hook_type != NO_HOOK)
+ {
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + hook_name_size;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + hook_name_size, hookc->name))
hookc = 0;
if (!hookc)
***************
*** 3130,3135 ****
if (hookc)
{
! hookc->hook = newc; /* Target gets hooked. */
! newc->hookee = hookc; /* We are marked as hooking target cmd. */
}
}
--- 3201,3217 ----
if (hookc)
{
! if (hook_type == PRE_HOOK)
! {
! hookc->hook_pre = newc; /* Target gets hooked. */
! hookc->hook_in = 0; /* Not in the hook yet. */
! newc->hookee_pre = hookc; /* We are marked as hooking target
cmd. */
! }
! else /* Must be a post hook, otherwise hookc would be 0. */
! {
! hookc->hook_post = newc; /* Target gets hooked */
! hookc->hook_in = 0;
! newc->hookee_post = hookc; /* We are marked as hooking target
cmd. */
! }
!
}
}
From sbjohnson@ozemail.com.au Wed Aug 16 17:18:00 2000
From: Steven Johnson <sbjohnson@ozemail.com.au>
To: gdb-patches@sourceware.cygnus.com
Subject: Patch to Command Hook Handling (Again).
Date: Wed, 16 Aug 2000 17:18:00 -0000
Message-id: <399B2CAF.9D9823D6@ozemail.com.au>
X-SW-Source: 2000-08/msg00260.html
Content-length: 14380
Sorry,
I Noticed that netscape line wrapped my message and wrecked the Changelog
entries and Patch, so I fixed it. This one should be OK.
Attached is a patch that achieves the following:
1. Removes a potential problem with hooks where a hook calling
it's hooked command will end up in recursion until GDB Segfaults.
2. Adds the "hookpost-" hook. This is similar to "hook-" except
the hook is run after the command and not before. "hookpost-"
and "hook-" are not mutually exclusive, they can both exist
simultaneously on the same command.
3. Adds a "hookpre-" this is the same as "hook-" but I added it
for clarity when using the post hook. There is code present,
such that if you use "hook-" on a command then "hookpre-" no
longer is valid and vice versa.
4. Updated gdb.texinfo section on hooks to document "hookpost-"
and "hookpre-".
By way of example, the following is now possible:
define hook-echo
echo We are in hook-echo\n
end
define hookpost-echo
echo We are in hookpost-echo\n
end
then when:
gdb> echo hello\n
is executed, the output is:
We are in hook-echo
hello
We are in hookpost-echo
Prior to this patch, hook-echo above would have caused GDB to crash with a
segfault.
Changelog for gdb:
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* Added "hookpost-" and "hookpre-" as an expansion on the original
hooking of commands to GDB. A Hook may now be run "AFTER" execution of
command as well as before.
* command.h - Changed cmd_list_element.hook and
cmd_list_element.hookee to hook_pre and hookee_pre respectively.
Added hook_post and hookee_post to cmd_list_element for the post hook
command operation. Added hook_in to command so that an executing hook
can be flagged to prevent recursion.
* command.c - Changed initilisation of cmd_list_element of hook and
hookee to hook_pre and hookee_pre respectively. Added hook_post and
hookee_post to be initialised as hook_pre and hokee_pre. Added ability
to remove hook_post, where hooks where originally being handled.
Changed any reference to hook/hookee to hook_pre/hookee_pre
respectively. Initialise hook_in to state of hook not running.
* infrun.c - Carried through structure changes of cmd_list_element of
hook/hookee to hook_pre/hookee_pre respectively.
* top.c - Carried through structure changes of cmd_list_element of
hook/hookee to hook_pre/hookee_pre respectively. Added ability to
call post hook after command executes. Added ability for define command
to detect and properly set up post hook declerations and prevent
clashes in pre hook declerations between hook- and hookpre-.
Checks hook_in and only runs a hook when not set. Appropriately sets
and clears hook_in when hooks execute.
Changelog for gdb/doc
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* gdb.texinfo - Documented new post hook ability of GDB.
<<<----- PATCH STARTS HERE ----->>>
diff -C2 -r -b ../insight-5.0/gdb/command.c src/gdb/command.c
*** ../insight-5.0/gdb/command.c Fri Mar 24 09:43:19 2000
--- src/gdb/command.c Tue Aug 15 13:18:14 2000
***************
*** 115,119 ****
c->flags = 0;
c->replacement = NULL;
! c->hook = NULL;
c->prefixlist = NULL;
c->prefixname = NULL;
--- 115,121 ----
c->flags = 0;
c->replacement = NULL;
! c->hook_pre = NULL;
! c->hook_post = NULL;
! c->hook_in = 0;
c->prefixlist = NULL;
c->prefixname = NULL;
***************
*** 126,130 ****
c->enums = NULL;
c->user_commands = NULL;
! c->hookee = NULL;
c->cmd_pointer = NULL;
--- 128,133 ----
c->enums = NULL;
c->user_commands = NULL;
! c->hookee_pre = NULL;
! c->hookee_post = NULL;
c->cmd_pointer = NULL;
***************
*** 382,387 ****
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee)
! (*list)->hookee->hook = 0; /* Hook slips out of its mouth */
p = (*list)->next;
free ((PTR) * list);
--- 385,392 ----
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee_pre)
! (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
! if ((*list)->hookee_post)
! (*list)->hookee_post->hook_post = 0; /* Hook slips out of its butt */
p = (*list)->next;
free ((PTR) * list);
***************
*** 394,399 ****
if (STREQ (c->next->name, name))
{
! if (c->next->hookee)
! c->next->hookee->hook = 0; /* hooked cmd gets away. */
p = c->next->next;
free ((PTR) c->next);
--- 399,407 ----
if (STREQ (c->next->name, name))
{
! if (c->next->hookee_pre)
! c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
! if (c->next->hookee_post)
! c->next->hookee_post->hook_post = 0; /* remove post hook */
! /* (sorry, no suitable
fishing metaphore) */
p = c->next->next;
free ((PTR) c->next);
***************
*** 543,549 ****
help_list (cmdlist, "", c->class, stream);
! if (c->hook)
! fprintf_filtered (stream, "\nThis command has a hook defined: %s\n",
! c->hook->name);
}
--- 551,560 ----
help_list (cmdlist, "", c->class, stream);
! if (c->hook_pre)
! fprintf_filtered (stream, "\nThis command is run after : %s (pre hook)\n",
! c->hook_pre->name);
! if (c->hook_post)
! fprintf_filtered (stream, "\nThis command is run before : %s (post hook)\n",
! c->hook_post->name);
}
diff -C2 -r -b ../insight-5.0/gdb/command.h src/gdb/command.h
*** ../insight-5.0/gdb/command.h Wed Apr 12 04:28:57 2000
--- src/gdb/command.h Tue Aug 15 13:17:49 2000
***************
*** 151,155 ****
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook;
/* Nonzero identifies a prefix command. For them, the address
--- 151,162 ----
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook_pre;
!
! /* Hook for another command to be executed after this command. */
! struct cmd_list_element *hook_post;
!
! /* Flag that specifies if this command is already running it's hook. */
! /* Prevents the possibility of hook recursion. */
! int hook_in;
/* Nonzero identifies a prefix command. For them, the address
***************
*** 206,212 ****
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one,
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee;
/* Pointer to command that is aliased by this one, so the
--- 213,223 ----
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one, (by hook_pre)
! so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_pre;
!
! /* Pointer to command that is hooked by this one, (by hook_post)
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_post;
/* Pointer to command that is aliased by this one, so the
diff -C2 -r -b ../insight-5.0/gdb/doc/gdb.texinfo src/gdb/doc/gdb.texinfo
*** ../insight-5.0/gdb/doc/gdb.texinfo Fri May 12 20:30:39 2000
--- src/gdb/doc/gdb.texinfo Tue Aug 15 11:59:01 2000
***************
*** 11867,11870 ****
--- 11867,11881 ----
before that command.
+ A @emph{hook} may also be defined which is run after the command you
+ executed. Whenever you run the command @samp{foo}, if the user-defined
+ command @samp{hookpost-foo} exists, it is executed (with no arguments)
+ after that command. Post execution hooks may exist simultaneously with
+ Pre execution hooks, on the same command. To aid in script readability,
+ @samp{hookpre-foo} is also valid and performs the same operation as
+ @samp{hook-foo} documented above.
+
+ @c It would be nice if hookpost could be passed a parameter indicating
+ @c if the command it hooks executed properly or not.
+
@kindex stop@r{, a pseudo-command}
In addition, a pseudo-command, @samp{stop} exists. Defining
diff -C2 -r -b ../insight-5.0/gdb/infrun.c src/gdb/infrun.c
*** ../insight-5.0/gdb/infrun.c Thu Apr 20 21:00:29 2000
--- src/gdb/infrun.c Tue Aug 15 11:18:07 2000
***************
*** 3431,3437 ****
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook)
{
! catch_errors (hook_stop_stub, stop_command->hook,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
--- 3431,3437 ----
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook_pre)
{
! catch_errors (hook_stop_stub, stop_command->hook_pre,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
diff -C2 -r -b ../insight-5.0/gdb/top.c src/gdb/top.c
*** ../insight-5.0/gdb/top.c Thu Apr 13 02:46:03 2000
--- src/gdb/top.c Wed Aug 16 09:45:28 2000
***************
*** 1528,1534 ****
}
! /* If this command has been hooked, run the hook first. */
! if (c->hook)
! execute_user_command (c->hook, (char *) 0);
if (c->flags & DEPRECATED_WARN_USER)
--- 1528,1538 ----
}
! /* If this command has been pre-hooked, run the hook first. */
! if ((c->hook_pre) && (!c->hook_in))
! {
! c->hook_in = 1; /* Prevent recursive hooking */
! execute_user_command (c->hook_pre, (char *) 0);
! c->hook_in = 0; /* Allow hook to work again once it is complete */
! }
if (c->flags & DEPRECATED_WARN_USER)
***************
*** 1545,1548 ****
--- 1549,1561 ----
else
(*c->function.cfunc) (arg, from_tty & caution);
+
+ /* If this command has been post-hooked, run the hook last. */
+ if ((c->hook_post) && (!c->hook_in))
+ {
+ c->hook_in = 1; /* Prevent recursive hooking */
+ execute_user_command (c->hook_post, (char *) 0);
+ c->hook_in = 0; /* allow hook to work again once it is complete */
+ }
+
}
***************
*** 3063,3072 ****
int from_tty;
{
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *hookc = 0;
char *tem = comname;
! char tmpbuf[128];
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
validate_comname (comname);
--- 3076,3098 ----
int from_tty;
{
+ #define MAX_TMPBUF 128
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *oldc, *hookc = 0;
char *tem = comname;
! char *tem2;
! char tmpbuf[MAX_TMPBUF];
! int hook_type = 0; /* 0 = Not Hooked. 1 = Pre Hook, 2 = Post Hook */
! int hook_name_size = 0;
!
! #define NO_HOOK 0
! #define PRE_HOOK 1
! #define POST_HOOK 2
!
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
+ #define HOOK_PRE_STRING "hookpre-"
+ #define HOOK_PRE_LEN 8
+ #define HOOK_POST_STRING "hookpost-"
+ #define HOOK_POST_LEN 9
validate_comname (comname);
***************
*** 3093,3100 ****
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + HOOK_LEN;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + HOOK_LEN, hookc->name))
hookc = 0;
if (!hookc)
--- 3119,3171 ----
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
+ strncpy(tmpbuf,HOOK_PRE_STRING,MAX_TMPBUF);
+ strncat(tmpbuf,comname+HOOK_LEN,MAX_TMPBUF-HOOK_PRE_LEN);
+
+ tem2 = &tmpbuf[0];
+
+ oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
+
+ if (oldc && STREQ (tmpbuf, oldc->name))
+ {
+ error ("Can not define \"%s\"! \"%s\" has already been defined.",comname, oldc->name);
+ }
+ else
+ {
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_LEN;
+ }
+
+ }
+ else if (!strncmp (comname, HOOK_PRE_STRING, HOOK_PRE_LEN))
+ {
+ strncpy(tmpbuf,HOOK_STRING,MAX_TMPBUF);
+ strncat(tmpbuf,comname+HOOK_PRE_LEN,MAX_TMPBUF-HOOK_LEN);
+
+ tem2 = &tmpbuf[0];
+
+ oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
+
+ if (oldc && STREQ (tmpbuf, oldc->name))
+ {
+ error ("Can not define \"%s\"! \"%s\" has already been defined.",comname, oldc->name);
+ }
+ else
+ {
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_PRE_LEN;
+ }
+ }
+ else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN))
+ {
+ hook_type = POST_HOOK;
+ hook_name_size = HOOK_POST_LEN;
+ }
+
+ if (hook_type != NO_HOOK)
+ {
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + hook_name_size;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + hook_name_size, hookc->name))
hookc = 0;
if (!hookc)
***************
*** 3130,3135 ****
if (hookc)
{
! hookc->hook = newc; /* Target gets hooked. */
! newc->hookee = hookc; /* We are marked as hooking target cmd. */
}
}
--- 3201,3217 ----
if (hookc)
{
! if (hook_type == PRE_HOOK)
! {
! hookc->hook_pre = newc; /* Target gets hooked. */
! hookc->hook_in = 0; /* Not in the hook yet. */
! newc->hookee_pre = hookc; /* We are marked as hooking target cmd. */
! }
! else /* Must be a post hook, otherwise hookc would be 0. */
! {
! hookc->hook_post = newc; /* Target gets hooked */
! hookc->hook_in = 0;
! newc->hookee_post = hookc; /* We are marked as hooking target cmd. */
! }
!
}
}
From kettenis@wins.uva.nl Wed Aug 16 17:24:00 2000
From: Mark Kettenis <kettenis@wins.uva.nl>
To: sbjohnson@ozemail.com.au
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Patch to Command Hook Handling (Again).
Date: Wed, 16 Aug 2000 17:24:00 -0000
Message-id: <200008170024.e7H0OQA09230@delius.kettenis.local>
References: <399B2CAF.9D9823D6@ozemail.com.au>
X-SW-Source: 2000-08/msg00261.html
Content-length: 287
Date: Thu, 17 Aug 2000 10:07:11 +1000
From: Steven Johnson <sbjohnson@ozemail.com.au>
Sorry,
I Noticed that netscape line wrapped my message and wrecked the Changelog
entries and Patch, so I fixed it.
The lines are too long. Keep them withing 79 columns please.
Mark
From sbjohnson@ozemail.com.au Wed Aug 16 19:15:00 2000
From: Steven Johnson <sbjohnson@ozemail.com.au>
To: gdb-patches@sourceware.cygnus.com
Subject: Patch to command hook (3rd time lucky) [Now under 79 wide].
Date: Wed, 16 Aug 2000 19:15:00 -0000
Message-id: <399B482B.22496116@ozemail.com.au>
X-SW-Source: 2000-08/msg00262.html
Content-length: 14329
Attached is a patch that achieves the following (now in under 79 columns):
1. Removes a potential problem with hooks where a hook calling
it's hooked command will end up in recursion until GDB Segfaults.
2. Adds the "hookpost-" hook. This is similar to "hook-" except
the hook is run after the command and not before. "hookpost-"
and "hook-" are not mutually exclusive, they can both exist
simultaneously on the same command.
3. Adds a "hookpre-" this is the same as "hook-" but I added it
for clarity when using the post hook. There is code present,
such that if you use "hook-" on a command then "hookpre-" no
longer is valid and vice versa.
4. Updated gdb.texinfo section on hooks to document "hookpost-"
and "hookpre-".
By way of example, the following is now possible:
define hook-echo
echo We are in hook-echo\n
end
define hookpost-echo
echo We are in hookpost-echo\n
end
then when:
gdb> echo hello\n
is executed, the output is:
We are in hook-echo
hello
We are in hookpost-echo
Prior to this patch, hook-echo above would have caused GDB to crash with a
segfault.
Changelog for gdb:
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* Added "hookpost-" and "hookpre-" as an expansion on the original
hooking of commands to GDB. A Hook may now be run "AFTER" execution
of command as well as before.
* command.h - Changed cmd_list_element elements hook and hookee to
hook_pre and hookee_pre respectively. Added hook_post and
hookee_post to cmd_list_element for the post hook command
operation. Added hook_in to command so that an executing hook can
be flagged to prevent recursion.
* command.c - Changed initilisation of cmd_list_element of hook and
hookee to hook_pre and hookee_pre respectively. Added hook_post and
hookee_post to be initialised as hook_pre and hokee_pre. Added
ability to remove hook_post, where hooks where originally being
handled. Changed any reference to hook/hookee to hook_pre/hookee_pre
respectively. Initialise hook_in to state of hook not running.
* infrun.c - Carried through structure changes of cmd_list_element of
hook/hookee to hook_pre/hookee_pre respectively.
* top.c - Carried through structure changes of cmd_list_element of
hook/hookee to hook_pre/hookee_pre respectively. Added ability to
call post hook after command executes. Added ability for define
command to detect and properly set up post hook declerations and
prevent clashes in pre hook declerations between hook- and hookpre-.
Checks hook_in and only runs a hook when not set. Appropriately sets
and clears hook_in when hooks execute.
Changelog for gdb/doc
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* gdb.texinfo - Documented new post hook ability of GDB.
<<<----- PATCH STARTS HERE ----->>>
diff -C2 -r -b ../insight-5.0/gdb/command.c src/gdb/command.c
*** ../insight-5.0/gdb/command.c Fri Mar 24 09:43:19 2000
--- src/gdb/command.c Thu Aug 17 11:15:00 2000
***************
*** 115,119 ****
c->flags = 0;
c->replacement = NULL;
! c->hook = NULL;
c->prefixlist = NULL;
c->prefixname = NULL;
--- 115,121 ----
c->flags = 0;
c->replacement = NULL;
! c->hook_pre = NULL;
! c->hook_post = NULL;
! c->hook_in = 0;
c->prefixlist = NULL;
c->prefixname = NULL;
***************
*** 126,130 ****
c->enums = NULL;
c->user_commands = NULL;
! c->hookee = NULL;
c->cmd_pointer = NULL;
--- 128,133 ----
c->enums = NULL;
c->user_commands = NULL;
! c->hookee_pre = NULL;
! c->hookee_post = NULL;
c->cmd_pointer = NULL;
***************
*** 382,387 ****
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee)
! (*list)->hookee->hook = 0; /* Hook slips out of its mouth */
p = (*list)->next;
free ((PTR) * list);
--- 385,392 ----
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee_pre)
! (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
! if ((*list)->hookee_post)
! (*list)->hookee_post->hook_post = 0; /* Hook slips out of its butt */
p = (*list)->next;
free ((PTR) * list);
***************
*** 394,399 ****
if (STREQ (c->next->name, name))
{
! if (c->next->hookee)
! c->next->hookee->hook = 0; /* hooked cmd gets away. */
p = c->next->next;
free ((PTR) c->next);
--- 399,407 ----
if (STREQ (c->next->name, name))
{
! if (c->next->hookee_pre)
! c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
! if (c->next->hookee_post)
! c->next->hookee_post->hook_post = 0; /* remove post hook */
! /* (sorry, no fishing metaphore) */
p = c->next->next;
free ((PTR) c->next);
***************
*** 543,549 ****
help_list (cmdlist, "", c->class, stream);
! if (c->hook)
! fprintf_filtered (stream, "\nThis command has a hook defined: %s\n",
! c->hook->name);
}
--- 551,562 ----
help_list (cmdlist, "", c->class, stream);
! if (c->hook_pre)
! fprintf_filtered (stream,
! "\nThis command is run after : %s (pre hook)\n",
! c->hook_pre->name);
! if (c->hook_post)
! fprintf_filtered (stream,
! "\nThis command is run before : %s (post hook)\n",
! c->hook_post->name);
}
diff -C2 -r -b ../insight-5.0/gdb/command.h src/gdb/command.h
*** ../insight-5.0/gdb/command.h Wed Apr 12 04:28:57 2000
--- src/gdb/command.h Tue Aug 15 13:17:49 2000
***************
*** 151,155 ****
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook;
/* Nonzero identifies a prefix command. For them, the address
--- 151,162 ----
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook_pre;
!
! /* Hook for another command to be executed after this command. */
! struct cmd_list_element *hook_post;
!
! /* Flag that specifies if this command is already running it's hook. */
! /* Prevents the possibility of hook recursion. */
! int hook_in;
/* Nonzero identifies a prefix command. For them, the address
***************
*** 206,212 ****
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one,
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee;
/* Pointer to command that is aliased by this one, so the
--- 213,223 ----
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one, (by hook_pre)
! so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_pre;
!
! /* Pointer to command that is hooked by this one, (by hook_post)
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_post;
/* Pointer to command that is aliased by this one, so the
diff -C2 -r -b ../insight-5.0/gdb/doc/gdb.texinfo src/gdb/doc/gdb.texinfo
*** ../insight-5.0/gdb/doc/gdb.texinfo Fri May 12 20:30:39 2000
--- src/gdb/doc/gdb.texinfo Tue Aug 15 11:59:01 2000
***************
*** 11867,11870 ****
--- 11867,11881 ----
before that command.
+ A @emph{hook} may also be defined which is run after the command you
+ executed. Whenever you run the command @samp{foo}, if the user-defined
+ command @samp{hookpost-foo} exists, it is executed (with no arguments)
+ after that command. Post execution hooks may exist simultaneously with
+ Pre execution hooks, on the same command. To aid in script readability,
+ @samp{hookpre-foo} is also valid and performs the same operation as
+ @samp{hook-foo} documented above.
+
+ @c It would be nice if hookpost could be passed a parameter indicating
+ @c if the command it hooks executed properly or not.
+
@kindex stop@r{, a pseudo-command}
In addition, a pseudo-command, @samp{stop} exists. Defining
diff -C2 -r -b ../insight-5.0/gdb/infrun.c src/gdb/infrun.c
*** ../insight-5.0/gdb/infrun.c Thu Apr 20 21:00:29 2000
--- src/gdb/infrun.c Tue Aug 15 11:18:07 2000
***************
*** 3431,3437 ****
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook)
{
! catch_errors (hook_stop_stub, stop_command->hook,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
--- 3431,3437 ----
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook_pre)
{
! catch_errors (hook_stop_stub, stop_command->hook_pre,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
diff -C2 -r -b ../insight-5.0/gdb/top.c src/gdb/top.c
*** ../insight-5.0/gdb/top.c Thu Apr 13 02:46:03 2000
--- src/gdb/top.c Thu Aug 17 11:17:13 2000
***************
*** 1528,1534 ****
}
! /* If this command has been hooked, run the hook first. */
! if (c->hook)
! execute_user_command (c->hook, (char *) 0);
if (c->flags & DEPRECATED_WARN_USER)
--- 1528,1538 ----
}
! /* If this command has been pre-hooked, run the hook first. */
! if ((c->hook_pre) && (!c->hook_in))
! {
! c->hook_in = 1; /* Prevent recursive hooking */
! execute_user_command (c->hook_pre, (char *) 0);
! c->hook_in = 0; /* Allow hook to work again once it is complete */
! }
if (c->flags & DEPRECATED_WARN_USER)
***************
*** 1545,1548 ****
--- 1549,1561 ----
else
(*c->function.cfunc) (arg, from_tty & caution);
+
+ /* If this command has been post-hooked, run the hook last. */
+ if ((c->hook_post) && (!c->hook_in))
+ {
+ c->hook_in = 1; /* Prevent recursive hooking */
+ execute_user_command (c->hook_post, (char *) 0);
+ c->hook_in = 0; /* allow hook to work again once it is complete */
+ }
+
}
***************
*** 3063,3072 ****
int from_tty;
{
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *hookc = 0;
char *tem = comname;
! char tmpbuf[128];
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
validate_comname (comname);
--- 3076,3098 ----
int from_tty;
{
+ #define MAX_TMPBUF 128
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *oldc, *hookc = 0;
char *tem = comname;
! char *tem2;
! char tmpbuf[MAX_TMPBUF];
! int hook_type = 0; /* 0 = Not Hooked. 1 = Pre Hook, 2 = Post Hook */
! int hook_name_size = 0;
!
! #define NO_HOOK 0
! #define PRE_HOOK 1
! #define POST_HOOK 2
!
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
+ #define HOOK_PRE_STRING "hookpre-"
+ #define HOOK_PRE_LEN 8
+ #define HOOK_POST_STRING "hookpost-"
+ #define HOOK_POST_LEN 9
validate_comname (comname);
***************
*** 3093,3100 ****
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + HOOK_LEN;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + HOOK_LEN, hookc->name))
hookc = 0;
if (!hookc)
--- 3119,3173 ----
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
+ strncpy(tmpbuf,HOOK_PRE_STRING,MAX_TMPBUF);
+ strncat(tmpbuf,comname+HOOK_LEN,MAX_TMPBUF-HOOK_PRE_LEN);
+
+ tem2 = &tmpbuf[0];
+
+ oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
+
+ if (oldc && STREQ (tmpbuf, oldc->name))
+ {
+ error ("Can not define \"%s\"! \"%s\" has already been defined.",
+ comname, oldc->name);
+ }
+ else
+ {
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_LEN;
+ }
+
+ }
+ else if (!strncmp (comname, HOOK_PRE_STRING, HOOK_PRE_LEN))
+ {
+ strncpy(tmpbuf,HOOK_STRING,MAX_TMPBUF);
+ strncat(tmpbuf,comname+HOOK_PRE_LEN,MAX_TMPBUF-HOOK_LEN);
+
+ tem2 = &tmpbuf[0];
+
+ oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
+
+ if (oldc && STREQ (tmpbuf, oldc->name))
+ {
+ error ("Can not define \"%s\"! \"%s\" has already been defined.",
+ comname, oldc->name);
+ }
+ else
+ {
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_PRE_LEN;
+ }
+ }
+ else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN))
+ {
+ hook_type = POST_HOOK;
+ hook_name_size = HOOK_POST_LEN;
+ }
+
+ if (hook_type != NO_HOOK)
+ {
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + hook_name_size;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + hook_name_size, hookc->name))
hookc = 0;
if (!hookc)
***************
*** 3130,3135 ****
if (hookc)
{
! hookc->hook = newc; /* Target gets hooked. */
! newc->hookee = hookc; /* We are marked as hooking target cmd. */
}
}
--- 3203,3219 ----
if (hookc)
{
! if (hook_type == PRE_HOOK)
! {
! hookc->hook_pre = newc; /* Target gets hooked. */
! hookc->hook_in = 0; /* Not in the hook yet. */
! newc->hookee_pre = hookc; /* We are marked as hooking target cmd.*/
! }
! else /* Must be a post hook, otherwise hookc would be 0. */
! {
! hookc->hook_post = newc; /* Target gets hooked */
! hookc->hook_in = 0; /* Not in the hook yet. */
! newc->hookee_post = hookc;/* We are marked as hooking target cmd. */
! }
!
}
}
From eliz@delorie.com Wed Aug 16 22:29:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: sbjohnson@ozemail.com.au
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Patch to command hook (3rd time lucky) [Now under 79 wide].
Date: Wed, 16 Aug 2000 22:29:00 -0000
Message-id: <200008170529.BAA13402@indy.delorie.com>
References: <399B482B.22496116@ozemail.com.au>
X-SW-Source: 2000-08/msg00263.html
Content-length: 1883
> Date: Thu, 17 Aug 2000 12:04:27 +1000
> From: Steven Johnson <sbjohnson@ozemail.com.au>
>
> 4. Updated gdb.texinfo section on hooks to document "hookpost-"
> and "hookpre-".
Thanks for working on this.
The patches to gdb.texinfo are approved, provided that the following
comments are taken care of:
> + A @emph{hook} may also be defined which is run after the command you
When introducing a new term, please use @dfn{}, not @emph{}.
> + executed. Whenever you run the command @samp{foo}, if the user-defined
Please leave two spaces after a period that ends a sentence. This
produces a much nicer results in the printed manual, and also makes
Emacs sentence-related commands DTRT.
Please also provide index entries for the hooks. I suggest these:
@cindex pre-command hooks
@cindex post-command hooks
@findex hookpre
@findex hookpost
> + #define MAX_TMPBUF 128
[snip]
> ! char tmpbuf[MAX_TMPBUF];
[snip]
> + strncpy(tmpbuf,HOOK_PRE_STRING,MAX_TMPBUF);
> + strncat(tmpbuf,comname+HOOK_LEN,MAX_TMPBUF-HOOK_PRE_LEN);
Why the arbitrary limitation on the length of the hook name? Is the
user-defined command name length limited in GDB? If so, MAX_TMPBUF
should be that limitation + sizeof("hookpost"). If there's no limit
on the length of a user-defined command, then I think the hooks should
not be limited, either.
> + strncpy(tmpbuf,HOOK_STRING,MAX_TMPBUF);
> + strncat(tmpbuf,comname+HOOK_PRE_LEN,MAX_TMPBUF-HOOK_LEN);
> +
> + tem2 = &tmpbuf[0];
> +
> + oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
> +
> + if (oldc && STREQ (tmpbuf, oldc->name))
> + {
> + error ("Can not define \"%s\"! \"%s\" has already been defined.",
> + comname, oldc->name);
Hmm... So how does one redefine or undefine a hook for a command?
I'm probably missing something, but what?
From sbjohnson@ozemail.com.au Thu Aug 17 00:11:00 2000
From: Steven Johnson <sbjohnson@ozemail.com.au>
To: Eli Zaretskii <eliz@is.elta.co.il>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Patch to command hook
Date: Thu, 17 Aug 2000 00:11:00 -0000
Message-id: <399B8D71.3FCEE4D1@ozemail.com.au>
References: <399B482B.22496116@ozemail.com.au> <200008170529.BAA13402@indy.delorie.com>
X-SW-Source: 2000-08/msg00264.html
Content-length: 3006
Eli Zaretskii wrote:
>
> > Date: Thu, 17 Aug 2000 12:04:27 +1000
> > From: Steven Johnson <sbjohnson@ozemail.com.au>
> >
> > 4. Updated gdb.texinfo section on hooks to document "hookpost-"
> > and "hookpre-".
>
> Thanks for working on this.
>
Your Welcome.
> The patches to gdb.texinfo are approved, provided that the following
> comments are taken care of:
>
> > + A @emph{hook} may also be defined which is run after the command you
>
> When introducing a new term, please use @dfn{}, not @emph{}.
>
> > + executed. Whenever you run the command @samp{foo}, if the user-defined
>
OK, I just copied @emph{hook} from the existing documentation of hooks. should
it also be @defn{hook} ?
> Please leave two spaces after a period that ends a sentence. This
> produces a much nicer results in the printed manual, and also makes
> Emacs sentence-related commands DTRT.
>
OK.
> Please also provide index entries for the hooks. I suggest these:
>
> @cindex pre-command hooks
> @cindex post-command hooks
> @findex hookpre
> @findex hookpost
>
OK.
> > + #define MAX_TMPBUF 128
> [snip]
> > ! char tmpbuf[MAX_TMPBUF];
> [snip]
> > + strncpy(tmpbuf,HOOK_PRE_STRING,MAX_TMPBUF);
> > + strncat(tmpbuf,comname+HOOK_LEN,MAX_TMPBUF-HOOK_PRE_LEN);
>
> Why the arbitrary limitation on the length of the hook name? Is the
> user-defined command name length limited in GDB? If so, MAX_TMPBUF
> should be that limitation + sizeof("hookpost"). If there's no limit
> on the length of a user-defined command, then I think the hooks should
> not be limited, either.
>
It was already in the function, I just made it into a #define, instead of a
hard coded 128 as it was before. I didn't give it much more thought but I will
look into it.
> > + strncpy(tmpbuf,HOOK_STRING,MAX_TMPBUF);
> > + strncat(tmpbuf,comname+HOOK_PRE_LEN,MAX_TMPBUF-HOOK_LEN);
> > +
> > + tem2 = &tmpbuf[0];
> > +
> > + oldc = lookup_cmd (&tem2, cmdlist, "", -1, 1);
> > +
> > + if (oldc && STREQ (tmpbuf, oldc->name))
> > + {
> > + error ("Can not define \"%s\"! \"%s\" has already been defined.",
> > + comname, oldc->name);
>
> Hmm... So how does one redefine or undefine a hook for a command?
> I'm probably missing something, but what?
Yes, this is the best I could come up with. I could find no way un un-defining
a command once it was defined. So, "hook-" and "hookpre-" are both seperate
commands, they are also mutually exclusive, so I made it that once you had
defined one or the other then you couldn't define the other. Ideally, I would
like it to come up with a warning, give you the option of not defining, or of
undefining the previous command. Maybe I just shouldn't of added "hookpre-"?
The other concern I had was when a script gets an error, how is the command
unrolled. I know it doesn't execute the hooked command, but the call to the
hook doesn't return anything (obvious) so how is it that execution terminates?
Steven.
From eliz@delorie.com Thu Aug 17 01:59:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: sbjohnson@ozemail.com.au
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Patch to command hook
Date: Thu, 17 Aug 2000 01:59:00 -0000
Message-id: <200008170859.EAA13581@indy.delorie.com>
References: <399B482B.22496116@ozemail.com.au> <200008170529.BAA13402@indy.delorie.com> <399B8D71.3FCEE4D1@ozemail.com.au>
X-SW-Source: 2000-08/msg00265.html
Content-length: 1114
> Date: Thu, 17 Aug 2000 17:00:01 +1000
> From: Steven Johnson <sbjohnson@ozemail.com.au>
>
> OK, I just copied @emph{hook} from the existing documentation of
> hooks. should it also be @defn{hook} ?
Yes, definitely.
> > Hmm... So how does one redefine or undefine a hook for a command?
> > I'm probably missing something, but what?
>
> Yes, this is the best I could come up with. I could find no way un un-defining
> a command once it was defined. So, "hook-" and "hookpre-" are both seperate
> commands, they are also mutually exclusive, so I made it that once you had
> defined one or the other then you couldn't define the other. Ideally, I would
> like it to come up with a warning, give you the option of not defining, or of
> undefining the previous command. Maybe I just shouldn't of added "hookpre-"?
>
> The other concern I had was when a script gets an error, how is the command
> unrolled. I know it doesn't execute the hooked command, but the call to the
> hook doesn't return anything (obvious) so how is it that execution terminates?
I'll leave it to the other maintainers to comment on this.
From muller@cerbere.u-strasbg.fr Thu Aug 17 07:30:00 2000
From: Pierre Muller <muller@cerbere.u-strasbg.fr>
To: gdb-patches@sourceware.cygnus.com, Andrew Cagney <ac131313@cygnus.com>
Subject: 2nd try [PATCH RFA] Pascal language part 3: Changes to Makefile.in
Date: Thu, 17 Aug 2000 07:30:00 -0000
Message-id: <200008171432.QAA09682@cerbere.u-strasbg.fr>
X-SW-Source: 2000-08/msg00266.html
Content-length: 3431
Back after my holidays, I would like to resubmit
the following patch.
This patch only covers the changes to Makefile.in
needed to incoporate pascal specific files into GDB.
MAINTAINERS files says ALL?
Andrew Cagney said that he tested this and it worked nicely,
but I whould like to have David Taylor's approval as this really concerns
language support.
The only differences to my first patch proposal are:
- the addition to the file substitution list for djgpp
as requested by Eli Zaretskii.
- added missing dependency of p-valprint.o on p-lang.h.
ChangeLog entry:
2000-08-17 Pierre Muller <muller@ics.u-strasbg.fr>
* Makefile.in: add rules to compile and link pascal specific files.
* config/djgpp/fnchange.lst: add substitution for p-exp.tab.c
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.42
diff -r1.42 Makefile.in
491c491,492
< mem-break.c minsyms.c mipsread.c nlmread.c objfiles.c parse.c \
---
> mem-break.c minsyms.c mipsread.c nlmread.c objfiles.c \
> p-exp.y p-lang.c p-typeprint.c p-valprint.c parse.c \
583c584
< m2-lang.h \
---
> m2-lang.h p-lang.h \
637c638
< m2-lang.o \
---
> m2-lang.o p-lang.o p-typeprint.o p-valprint.o \
657c658
< f-exp.tab.c m2-exp.tab.c
---
> f-exp.tab.c m2-exp.tab.c p-exp.tab.c
660c661
< f-exp.tab.o m2-exp.tab.o
---
> f-exp.tab.o m2-exp.tab.o p-exp.tab.o
807a809
> #unload $(srcdir)/p-exp.y
812a815
> #load p-exp.tab.c
905c908
< f-exp.tab.c m2-exp.tab.c
---
> f-exp.tab.c m2-exp.tab.c p-exp.tab.c
1038a1042,1059
> # p-exp.tab.c is generated in objdir from p-exp.y if it doesn't exist
> # in srcdir, then compiled in objdir to p-exp.tab.o.
> # Remove bogus decls for malloc/realloc/free which conflict with everything
> # else.
> p-exp.tab.o: p-exp.tab.c
> p-exp.tab.c: p-exp.y
> $(SHELL) $(YLWRAP) "$(YACC)" $(srcdir)/p-exp.y y.tab.c p-exp.tmp --
$(YFLAGS)
> -sed -e '/extern.*malloc/d' \
> -e '/extern.*realloc/d' \
> -e '/extern.*free/d' \
> -e '/include.*malloc.h/d' \
> -e 's/malloc/xmalloc/g' \
> -e 's/realloc/xrealloc/g' \
> -e '/^#line.*y.tab.c/d' \
> < p-exp.tmp > p-exp.new
> -rm p-exp.tmp
> mv p-exp.new ./p-exp.tab.c
>
1041c1062
< .PRECIOUS: jv-exp.tab.c
---
> .PRECIOUS: jv-exp.tab.c p-exp.tab.c
1512a1534,1543
> p-lang.o: p-lang.c p-lang.h $(defs_h) $(expression_h) $(gdbtypes_h) \
> language.h parser-defs.h $(symtab_h) gdb_string.h
>
> p-typeprint.o: p-typeprint.c p-lang.h $(defs_h) $(expression_h) \
> $(gdbcmd_h) $(gdbcore_h) $(gdbtypes_h) language.h $(symtab_h) \
> target.h typeprint.h $(value_h) gdb_string.h
>
> p-valprint.o: p-valprint.c p-lang.h $(defs_h) $(expression_h)
$(gdbtypes_h) \
> language.h $(symtab_h) valprint.h $(value_h) gdb_string.h
>
1956a1988,1991
> $(bfd_h) objfiles.h symfile.h
>
> p-exp.tab.o: p-exp.tab.c $(defs_h) $(expression_h) $(gdbtypes_h) \
> language.h p-lang.h parser-defs.h $(symtab_h) $(value_h) \
Index: config/djgpp/fnchange.lst
===================================================================
RCS file: /cvs/src/src/gdb/config/djgpp/fnchange.lst,v
retrieving revision 1.7
diff -r1.7 fnchange.lst
138a139
> @V@/gdb/p-exp.tab.c @V@/gdb/p-exp_tab.c
Pierre Muller
Institut Charles Sadron
6,rue Boussingault
F 67083 STRASBOURG CEDEX (France)
mailto:muller@ics.u-strasbg.fr
Phone : (33)-3-88-41-40-07 Fax : (33)-3-88-41-40-99
From eliz@delorie.com Thu Aug 17 11:49:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: muller@cerbere.u-strasbg.fr
Cc: gdb-patches@sourceware.cygnus.com, ac131313@cygnus.com
Subject: Re: 2nd try [PATCH RFA] Pascal language part 3: Changes to Makefile.in
Date: Thu, 17 Aug 2000 11:49:00 -0000
Message-id: <200008171849.OAA14173@indy.delorie.com>
References: <200008171432.QAA09682@cerbere.u-strasbg.fr>
X-SW-Source: 2000-08/msg00267.html
Content-length: 598
> Date: Thu, 17 Aug 2000 16:21:56 +0200
> From: Pierre Muller <muller@cerbere.u-strasbg.fr>
>
> ChangeLog entry:
>
> 2000-08-17 Pierre Muller <muller@ics.u-strasbg.fr>
> * Makefile.in: add rules to compile and link pascal specific files.
> * config/djgpp/fnchange.lst: add substitution for p-exp.tab.c
The patch to fnchange.lst is approved.
Please in the future send context diffs ("diff -c") or unified diffs
("diff -u"). The diffs you sent are very hard to read, and can easily
fail to apply if you didn't compute them against the same CVS as at
the time the maintainer(s) run Patch.
From sbjohnson@ozemail.com.au Thu Aug 17 23:38:00 2000
From: Steven Johnson <sbjohnson@ozemail.com.au>
To: gdb-patches@sourceware.cygnus.com
Subject: Patch to command hook [Revision 2]
Date: Thu, 17 Aug 2000 23:38:00 -0000
Message-id: <399CD748.BF42AE5C@ozemail.com.au>
References: <399B482B.22496116@ozemail.com.au> <200008170529.BAA13402@indy.delorie.com> <399B8D71.3FCEE4D1@ozemail.com.au> <200008170859.EAA13581@indy.delorie.com>
X-SW-Source: 2000-08/msg00268.html
Content-length: 14060
Version 2 of Post Command Hooks.
I Have,
1. Removed my previous attempt at adding "hookpre-" it caused more
problems than was worth it.
2. Added information to the documentation, @dfn, spaces, cindex and kindex
entries. Also a statement about calling a hooked command within the
hook. Added an example that shows both post hooks and calling of the
hooked command.
3. hopefully addressed all stated concerns.
Otherwise it is the same.
Changelog for gdb:
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* Added "hookpost-" as an expansion on the original hooking of commands
to GDB. A Hook may now be run "AFTER" execution of command as well
as before.
* command.h - Changed cmd_list_element elements hook and hookee to
hook_pre and hookee_pre respectively. Added hook_post and hookee_post
to cmd_list_element for the post hook command operation. Added
hook_in to command so that an executing hook can be flagged to
prevent recursion.
* command.c - Changed initilisation of cmd_list_element of hook and
hookee to hook_pre and hookee_pre respectively. Added hook_post and
hookee_post to be initialised as hook_pre and hokee_pre. Added
ability to remove hook_post, where hooks where originally being
handled. Changed any reference to hook/hookee to hook_pre/hookee_pre
respectively. Initialise hook_in to state of hook not running.
* infrun.c - Carried through structure changes of cmd_list_element of
hook/hookee to hook_pre/hookee_pre respectively.
* top.c - Carried through structure changes of cmd_list_element of
hook/hookee to hook_pre/hookee_pre respectively. Added ability to
call post hook after command executes. Added ability for define
command to detect and properly set up post hook declerations and
prevent clashes in pre hook declerations between hook- and hookpre-.
Checks hook_in and only runs a hook when not set. Appropriately sets
and clears hook_in when hooks execute.
Changelog for gdb/doc
2000-08-17 Steven Johnson <sbjohnson@ozemail.com.au>
* gdb.texinfo - Documented new post hook ability of GDB.
<<<----- PATCH STARTS HERE ----->>>
diff -C2 -r -b ../insight-5.0/gdb/command.c src/gdb/command.c
*** ../insight-5.0/gdb/command.c Fri Mar 24 09:43:19 2000
--- src/gdb/command.c Thu Aug 17 11:15:00 2000
***************
*** 115,119 ****
c->flags = 0;
c->replacement = NULL;
! c->hook = NULL;
c->prefixlist = NULL;
c->prefixname = NULL;
--- 115,121 ----
c->flags = 0;
c->replacement = NULL;
! c->hook_pre = NULL;
! c->hook_post = NULL;
! c->hook_in = 0;
c->prefixlist = NULL;
c->prefixname = NULL;
***************
*** 126,130 ****
c->enums = NULL;
c->user_commands = NULL;
! c->hookee = NULL;
c->cmd_pointer = NULL;
--- 128,133 ----
c->enums = NULL;
c->user_commands = NULL;
! c->hookee_pre = NULL;
! c->hookee_post = NULL;
c->cmd_pointer = NULL;
***************
*** 382,387 ****
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee)
! (*list)->hookee->hook = 0; /* Hook slips out of its mouth */
p = (*list)->next;
free ((PTR) * list);
--- 385,392 ----
while (*list && STREQ ((*list)->name, name))
{
! if ((*list)->hookee_pre)
! (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
! if ((*list)->hookee_post)
! (*list)->hookee_post->hook_post = 0; /* Hook slips out of its butt */
p = (*list)->next;
free ((PTR) * list);
***************
*** 394,399 ****
if (STREQ (c->next->name, name))
{
! if (c->next->hookee)
! c->next->hookee->hook = 0; /* hooked cmd gets away. */
p = c->next->next;
free ((PTR) c->next);
--- 399,407 ----
if (STREQ (c->next->name, name))
{
! if (c->next->hookee_pre)
! c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
! if (c->next->hookee_post)
! c->next->hookee_post->hook_post = 0; /* remove post hook */
! /* :( no fishing metaphore */
p = c->next->next;
free ((PTR) c->next);
***************
*** 543,549 ****
help_list (cmdlist, "", c->class, stream);
! if (c->hook)
! fprintf_filtered (stream, "\nThis command has a hook defined: %s\n",
! c->hook->name);
}
--- 551,562 ----
help_list (cmdlist, "", c->class, stream);
! if (c->hook_pre)
! fprintf_filtered (stream,
! "\nThis command is run after : %s (pre hook)\n",
! c->hook_pre->name);
! if (c->hook_post)
! fprintf_filtered (stream,
! "\nThis command is run before : %s (post hook)\n",
! c->hook_post->name);
}
diff -C2 -r -b ../insight-5.0/gdb/command.h src/gdb/command.h
*** ../insight-5.0/gdb/command.h Wed Apr 12 04:28:57 2000
--- src/gdb/command.h Tue Aug 15 13:17:49 2000
***************
*** 151,155 ****
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook;
/* Nonzero identifies a prefix command. For them, the address
--- 151,162 ----
/* Hook for another command to be executed before this command. */
! struct cmd_list_element *hook_pre;
!
! /* Hook for another command to be executed after this command. */
! struct cmd_list_element *hook_post;
!
! /* Flag that specifies if this command is already running it's hook. */
! /* Prevents the possibility of hook recursion. */
! int hook_in;
/* Nonzero identifies a prefix command. For them, the address
***************
*** 206,212 ****
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one,
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee;
/* Pointer to command that is aliased by this one, so the
--- 213,223 ----
struct command_line *user_commands;
! /* Pointer to command that is hooked by this one, (by hook_pre)
! so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_pre;
!
! /* Pointer to command that is hooked by this one, (by hook_post)
so the hook can be removed when this one is deleted. */
! struct cmd_list_element *hookee_post;
/* Pointer to command that is aliased by this one, so the
diff -C2 -r -b ../insight-5.0/gdb/doc/gdb.texinfo src/gdb/doc/gdb.texinfo
*** ../insight-5.0/gdb/doc/gdb.texinfo Fri May 12 20:30:39 2000
--- src/gdb/doc/gdb.texinfo Fri Aug 18 13:50:54 2000
***************
*** 1,3 ****
! \input texinfo @c -*-texinfo-*-
@c Copyright 1988-2000
@c Free Software Foundation, Inc.
--- 1,3 ----
! echo\input texinfo @c -*-texinfo-*-
@c Copyright 1988-2000
@c Free Software Foundation, Inc.
***************
*** 11861,11870 ****
@cindex command hooks
@cindex hooks, for commands
! You may define @emph{hooks}, which are a special kind of user-defined
command. Whenever you run the command @samp{foo}, if the user-defined
command @samp{hook-foo} exists, it is executed (with no arguments)
before that command.
@kindex stop@r{, a pseudo-command}
In addition, a pseudo-command, @samp{stop} exists. Defining
--- 11861,11889 ----
@cindex command hooks
@cindex hooks, for commands
+ @cindex hooks, pre-command
! @kindex hook
! @kindex hook-
! You may define @dfn{hooks}, which are a special kind of user-defined
command. Whenever you run the command @samp{foo}, if the user-defined
command @samp{hook-foo} exists, it is executed (with no arguments)
before that command.
+ @cindex hooks, post-command
+ @kindex hookpost
+ @kindex hookpost-
+ A @dfn{hook} may also be defined which is run after the command you
+ executed. Whenever you run the command @samp{foo}, if the user-defined
+ command @samp{hookpost-foo} exists, it is executed (with no arguments)
+ after that command. Post execution hooks may exist simultaneously with
+ Pre execution hooks, on the same command.
+
+ It is valid for a @dfn{hook} to call the command it is hooked to. If
+ this occurs, the hook is not re-executed, thereby avoiding infinte
+ recursion.
+
+ @c It would be nice if hookpost could be passed a parameter indicating
+ @c if the command it hooks executed properly or not.
+
@kindex stop@r{, a pseudo-command}
In addition, a pseudo-command, @samp{stop} exists. Defining
***************
*** 11889,11892 ****
--- 11908,11930 ----
handle SIGLARM pass
end
+ @end example
+
+ As a further example, to hook at the begining and end of the @code{echo}
+ command, and to add extra text to the beginning and end of the message,
+ you could define:
+
+ @example
+ define hook-echo
+ echo <<<---
+ end
+
+ define hookpost-echo
+ echo --->>>\n
+ end
+
+ (gdb) echo Hello World
+ <<<---Hello World--->>>
+ (gdb)
+
@end example
diff -C2 -r -b ../insight-5.0/gdb/infrun.c src/gdb/infrun.c
*** ../insight-5.0/gdb/infrun.c Thu Apr 20 21:00:29 2000
--- src/gdb/infrun.c Tue Aug 15 11:18:07 2000
***************
*** 3431,3437 ****
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook)
{
! catch_errors (hook_stop_stub, stop_command->hook,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
--- 3431,3437 ----
/* Look up the hook_stop and run it if it exists. */
! if (stop_command && stop_command->hook_pre)
{
! catch_errors (hook_stop_stub, stop_command->hook_pre,
"Error while running hook_stop:\n", RETURN_MASK_ALL);
}
diff -C2 -r -b ../insight-5.0/gdb/top.c src/gdb/top.c
*** ../insight-5.0/gdb/top.c Thu Apr 13 02:46:03 2000
--- src/gdb/top.c Fri Aug 18 13:45:47 2000
***************
*** 1528,1534 ****
}
! /* If this command has been hooked, run the hook first. */
! if (c->hook)
! execute_user_command (c->hook, (char *) 0);
if (c->flags & DEPRECATED_WARN_USER)
--- 1528,1538 ----
}
! /* If this command has been pre-hooked, run the hook first. */
! if ((c->hook_pre) && (!c->hook_in))
! {
! c->hook_in = 1; /* Prevent recursive hooking */
! execute_user_command (c->hook_pre, (char *) 0);
! c->hook_in = 0; /* Allow hook to work again once it is complete */
! }
if (c->flags & DEPRECATED_WARN_USER)
***************
*** 1545,1548 ****
--- 1549,1561 ----
else
(*c->function.cfunc) (arg, from_tty & caution);
+
+ /* If this command has been post-hooked, run the hook last. */
+ if ((c->hook_post) && (!c->hook_in))
+ {
+ c->hook_in = 1; /* Prevent recursive hooking */
+ execute_user_command (c->hook_post, (char *) 0);
+ c->hook_in = 0; /* allow hook to work again once it is complete */
+ }
+
}
***************
*** 3063,3072 ****
int from_tty;
{
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *hookc = 0;
char *tem = comname;
! char tmpbuf[128];
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
validate_comname (comname);
--- 3076,3096 ----
int from_tty;
{
+ #define MAX_TMPBUF 128
register struct command_line *cmds;
! register struct cmd_list_element *c, *newc, *oldc, *hookc = 0;
char *tem = comname;
! char *tem2;
! char tmpbuf[MAX_TMPBUF];
! int hook_type = 0; /* 0 = Not Hooked. 1 = Pre Hook, 2 = Post Hook */
! int hook_name_size = 0;
!
! #define NO_HOOK 0
! #define PRE_HOOK 1
! #define POST_HOOK 2
!
#define HOOK_STRING "hook-"
#define HOOK_LEN 5
+ #define HOOK_POST_STRING "hookpost-"
+ #define HOOK_POST_LEN 9
validate_comname (comname);
***************
*** 3093,3100 ****
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + HOOK_LEN;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + HOOK_LEN, hookc->name))
hookc = 0;
if (!hookc)
--- 3117,3135 ----
if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
{
+ hook_type = PRE_HOOK;
+ hook_name_size = HOOK_LEN;
+ }
+ else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN))
+ {
+ hook_type = POST_HOOK;
+ hook_name_size = HOOK_POST_LEN;
+ }
+
+ if (hook_type != NO_HOOK)
+ {
/* Look up cmd it hooks, and verify that we got an exact match. */
! tem = comname + hook_name_size;
hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
! if (hookc && !STREQ (comname + hook_name_size, hookc->name))
hookc = 0;
if (!hookc)
***************
*** 3130,3135 ****
if (hookc)
{
! hookc->hook = newc; /* Target gets hooked. */
! newc->hookee = hookc; /* We are marked as hooking target cmd. */
}
}
--- 3165,3181 ----
if (hookc)
{
! if (hook_type == PRE_HOOK)
! {
! hookc->hook_pre = newc; /* Target gets hooked. */
! hookc->hook_in = 0; /* Not in the hook yet. */
! newc->hookee_pre = hookc; /* We are marked as hooking target cmd. */
! }
! else /* Must be a post hook, otherwise hookc would be 0. */
! {
! hookc->hook_post = newc; /* Target gets hooked */
! hookc->hook_in = 0; /* Not in the hook yet. */
! newc->hookee_post = hookc;/* We are marked as hooking target cmd. */
! }
!
}
}
From eliz@delorie.com Fri Aug 18 02:24:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: sbjohnson@ozemail.com.au
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Patch to command hook [Revision 2]
Date: Fri, 18 Aug 2000 02:24:00 -0000
Message-id: <200008180924.FAA14909@indy.delorie.com>
References: <399B482B.22496116@ozemail.com.au> <200008170529.BAA13402@indy.delorie.com> <399B8D71.3FCEE4D1@ozemail.com.au> <200008170859.EAA13581@indy.delorie.com> <399CD748.BF42AE5C@ozemail.com.au>
X-SW-Source: 2000-08/msg00269.html
Content-length: 1459
> Date: Fri, 18 Aug 2000 16:27:20 +1000
> From: Steven Johnson <sbjohnson@ozemail.com.au>
>
> ! \input texinfo @c -*-texinfo-*-
> @c Copyright 1988-2000
> @c Free Software Foundation, Inc.
> --- 1,3 ----
> ! echo\input texinfo @c -*-texinfo-*-
You didn't really mean this change, did you? ;-)
> ! @kindex hook
> ! @kindex hook-
> ! You may define @dfn{hooks}, which are a special kind of user-defined
> command. Whenever you run the command @samp{foo}, if the user-defined
> command @samp{hook-foo} exists, it is executed (with no arguments)
> before that command.
>
> + @cindex hooks, post-command
> + @kindex hookpost
> + @kindex hookpost-
> + A @dfn{hook} may also be defined which is run after the command you
> + executed. Whenever you run the command @samp{foo}, if the user-defined
> + command @samp{hookpost-foo} exists, it is executed (with no arguments)
> + after that command. Post execution hooks may exist simultaneously with
> + Pre execution hooks, on the same command.
> +
> + It is valid for a @dfn{hook} to call the command it is hooked to. If
> + this occurs, the hook is not re-executed, thereby avoiding infinte
> + recursion.
A @dfn should only be used once for each term, where it is first
encountered. The other places should have the word with no markup at
all.
(If you are going to commit the changes to gdb.texinfo, please change
that; otherwise, I will change it myself when I commit them.)
From ac131313@cygnus.com Fri Aug 18 14:54:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: [patch] param fixes
Date: Fri, 18 Aug 2000 14:54:00 -0000
Message-id: <399DAFCA.DA249E37@cygnus.com>
X-SW-Source: 2000-08/msg00270.html
Content-length: 1253
FYI,
I've checked in the attached. It fixes more K&R -> ISO-C fallout.
Andrew
2000-08-18 Andrew Cagney <cagney@ops1.cygnus.com>
* remote-array.c (array_fetch_register): Pass dummy parameter to
array_fetch_registers.
(array_store_register): Ditto.
Index: gdb/remote-array.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-array.c,v
retrieving revision 1.4
diff -p -r1.4 remote-array.c
*** remote-array.c 2000/07/30 01:48:26 1.4
--- remote-array.c 2000/08/18 19:09:48
*************** array_fetch_registers (int ignored)
*** 832,838 ****
static void
array_fetch_register (int ignored)
{
! array_fetch_registers ();
}
/*
--- 832,838 ----
static void
array_fetch_register (int ignored)
{
! array_fetch_registers (0 /* ignored */);
}
/*
*************** array_store_registers (int ignored)
*** 880,886 ****
static void
array_store_register (int ignored)
{
! array_store_registers ();
}
/* Get ready to modify the registers array. On machines which store
--- 880,886 ----
static void
array_store_register (int ignored)
{
! array_store_registers (0 /* ignored */);
}
/* Get ready to modify the registers array. On machines which store
From jtc@redback.com Fri Aug 18 15:49:00 2000
From: jtc@redback.com (J.T. Conklin)
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH]: more dcache cleanup
Date: Fri, 18 Aug 2000 15:49:00 -0000
Message-id: <5mlmxuxk11.fsf@jtc.redback.com>
X-SW-Source: 2000-08/msg00271.html
Content-length: 15269
Enclosed is a patch that I'll be committing shortly.
The bulk of it is renaming "dcache_flush" to the less ambigous
"dcache_invd". It also fixes a problem where the cache wasn't
invalidated when a new image was loaded with the nindy monitor,
and a problem where the dcache i/o functions were different for
different ROM monitors.
--jtc
2000-08-18 J.T. Conklin <jtc@redback.com>
* MAINTAINERS: Add myself as dcache.c maintainer.
* remote-nindy.c (nindy_load): Invalidate dcache.
* dcache.c (dcache_invd): Renamed from dcache_flush. The term
flush with respect to caches usually implies that data will be
written to memory.
(dcache_init, dcache_xfer_memory): Updated.
* monitor.c (flush_monitor_dcache, monitor_resume, monitor_load):
Updated.
* ocd.c (ocd_open, ocd_resume, bdm_reset_command): Updated.
* remote-bug.c (bug_load, bug_resume): Updated.
* remote-nindy.c (nindy_open, nindy_resume): Updated.
* remote-sds.c (sds_open, sds_resume): Updated.
* remote-utils.c (gr_open): Updated.
* remote.c (remote_open_1, remote_resume, remote_async_resume,
remote_cisco_open): Updated.
* wince.c (child_create_inferior, child_resume): Updated.
* monitor.c (monitor_open): Free dcache before creating a new one.
* dcache.c (dcache_free): New function.
* dcache.h (dcache_free): New prototype.
Index: MAINTAINERS
===================================================================
RCS file: /cvs/src/src/gdb/MAINTAINERS,v
retrieving revision 1.46
diff -c -r1.46 MAINTAINERS
*** MAINTAINERS 2000/08/11 00:25:19 1.46
--- MAINTAINERS 2000/08/18 22:40:13
***************
*** 188,193 ****
--- 188,194 ----
hp tests (gdb.hp) Jimmy Guo guo@cup.hp.com
Java tests (gdb.java) Anthony Green green@cygnus.com
Kernel Object Display Fernando Nasser fnasser@cygnus.com
+ dcache.c J.T. Conklin jtc@redback.com
UI: External (user) interfaces.
Index: dcache.c
===================================================================
RCS file: /cvs/src/src/gdb/dcache.c,v
retrieving revision 1.7
diff -c -r1.7 dcache.c
*** dcache.c 2000/08/11 14:47:38 1.7
--- dcache.c 2000/08/18 22:40:14
***************
*** 173,179 ****
/* Free all the data cache blocks, thus discarding all cached data. */
void
! dcache_flush (DCACHE *dcache)
{
int i;
dcache->valid_head = 0;
--- 173,179 ----
/* Free all the data cache blocks, thus discarding all cached data. */
void
! dcache_invd (DCACHE *dcache)
{
int i;
dcache->valid_head = 0;
***************
*** 402,413 ****
dcache->the_cache = (struct dcache_block *) xmalloc (csize);
memset (dcache->the_cache, 0, csize);
! dcache_flush (dcache);
last_cache = dcache;
return dcache;
}
/* Read or write LEN bytes from inferior memory at MEMADDR, transferring
to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
nonzero.
--- 402,424 ----
dcache->the_cache = (struct dcache_block *) xmalloc (csize);
memset (dcache->the_cache, 0, csize);
! dcache_invd (dcache);
last_cache = dcache;
return dcache;
}
+ /* Free a data cache */
+ void
+ dcache_free (DCACHE *dcache)
+ {
+ if (last_cache == dcache)
+ last_cache = NULL;
+
+ free (dcache->the_cache);
+ free (dcache);
+ }
+
/* Read or write LEN bytes from inferior memory at MEMADDR, transferring
to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
nonzero.
***************
*** 441,447 ****
xfunc = should_write ? dcache->write_memory : dcache->read_memory;
if (dcache->cache_has_stuff)
! dcache_flush (dcache);
len = xfunc (memaddr, myaddr, len);
}
--- 452,458 ----
xfunc = should_write ? dcache->write_memory : dcache->read_memory;
if (dcache->cache_has_stuff)
! dcache_invd (dcache);
len = xfunc (memaddr, myaddr, len);
}
Index: dcache.h
===================================================================
RCS file: /cvs/src/src/gdb/dcache.h,v
retrieving revision 1.4
diff -c -r1.4 dcache.h
*** dcache.h 2000/06/19 18:59:07 1.4
--- dcache.h 2000/08/18 22:40:14
***************
*** 27,37 ****
typedef struct dcache_struct DCACHE;
! /* Flush DCACHE. */
! void dcache_flush (DCACHE * dcache);
/* Initialize DCACHE. */
DCACHE *dcache_init (memxferfunc reading, memxferfunc writing);
/* Simple to call from <remote>_xfer_memory */
--- 27,40 ----
typedef struct dcache_struct DCACHE;
! /* Invalidate DCACHE. */
! void dcache_invd (DCACHE * dcache);
/* Initialize DCACHE. */
DCACHE *dcache_init (memxferfunc reading, memxferfunc writing);
+
+ /* Free a DCACHE */
+ void dcache_free (DCACHE *);
/* Simple to call from <remote>_xfer_memory */
Index: monitor.c
===================================================================
RCS file: /cvs/src/src/gdb/monitor.c,v
retrieving revision 1.9
diff -c -r1.9 monitor.c
*** monitor.c 2000/08/10 18:54:27 1.9
--- monitor.c 2000/08/18 22:40:16
***************
*** 838,853 ****
monitor_printf (current_monitor->line_term);
! if (!remote_dcache)
! {
! if (current_monitor->flags & MO_HAS_BLOCKWRITES)
! remote_dcache = dcache_init (monitor_read_memory,
! monitor_write_memory_block);
! else
! remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory);
! }
else
! dcache_flush (remote_dcache);
start_remote ();
}
--- 838,851 ----
monitor_printf (current_monitor->line_term);
! if (remote_dcache)
! dcache_free (remote_dcache);
!
! if (current_monitor->flags & MO_HAS_BLOCKWRITES)
! remote_dcache = dcache_init (monitor_read_memory,
! monitor_write_memory_block);
else
! remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory);
start_remote ();
}
***************
*** 934,940 ****
void
flush_monitor_dcache (void)
{
! dcache_flush (remote_dcache);
}
static void
--- 932,938 ----
void
flush_monitor_dcache (void)
{
! dcache_invd (remote_dcache);
}
static void
***************
*** 950,956 ****
dump_reg_flag = 1;
return;
}
! dcache_flush (remote_dcache);
if (step)
monitor_printf (current_monitor->step);
else
--- 948,954 ----
dump_reg_flag = 1;
return;
}
! dcache_invd (remote_dcache);
if (step)
monitor_printf (current_monitor->step);
else
***************
*** 2147,2153 ****
static void
monitor_load (char *file, int from_tty)
{
! dcache_flush (remote_dcache);
monitor_debug ("MON load\n");
if (current_monitor->load_routine)
--- 2145,2151 ----
static void
monitor_load (char *file, int from_tty)
{
! dcache_invd (remote_dcache);
monitor_debug ("MON load\n");
if (current_monitor->load_routine)
Index: ocd.c
===================================================================
RCS file: /cvs/src/src/gdb/ocd.c,v
retrieving revision 1.6
diff -c -r1.6 ocd.c
*** ocd.c 2000/08/10 18:54:27 1.6
--- ocd.c 2000/08/18 22:40:17
***************
*** 295,301 ****
if (!ocd_dcache)
ocd_dcache = dcache_init (ocd_read_bytes, ocd_write_bytes);
else
! dcache_flush (ocd_dcache);
if (strncmp (name, "wiggler", 7) == 0)
{
--- 295,301 ----
if (!ocd_dcache)
ocd_dcache = dcache_init (ocd_read_bytes, ocd_write_bytes);
else
! dcache_invd (ocd_dcache);
if (strncmp (name, "wiggler", 7) == 0)
{
***************
*** 387,393 ****
{
int pktlen;
! dcache_flush (ocd_dcache);
if (step)
ocd_do_command (OCD_STEP, &last_run_status, &pktlen);
--- 387,393 ----
{
int pktlen;
! dcache_invd (ocd_dcache);
if (step)
ocd_do_command (OCD_STEP, &last_run_status, &pktlen);
***************
*** 1318,1324 ****
error ("Not connected to OCD device.");
ocd_do_command (OCD_RESET, &status, &pktlen);
! dcache_flush (ocd_dcache);
registers_changed ();
}
--- 1318,1324 ----
error ("Not connected to OCD device.");
ocd_do_command (OCD_RESET, &status, &pktlen);
! dcache_invd (ocd_dcache);
registers_changed ();
}
Index: remote-bug.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-bug.c,v
retrieving revision 1.5
diff -c -r1.5 remote-bug.c
*** remote-bug.c 2000/07/30 01:48:26 1.5
--- remote-bug.c 2000/08/18 22:40:17
***************
*** 119,125 ****
sr_check_open ();
! dcache_flush (gr_get_dcache ());
inferior_pid = 0;
abfd = bfd_openr (args, 0);
if (!abfd)
--- 119,125 ----
sr_check_open ();
! dcache_invd (gr_get_dcache ());
inferior_pid = 0;
abfd = bfd_openr (args, 0);
if (!abfd)
***************
*** 242,248 ****
void
bug_resume (int pid, int step, enum target_signal sig)
{
! dcache_flush (gr_get_dcache ());
if (step)
{
--- 242,248 ----
void
bug_resume (int pid, int step, enum target_signal sig)
{
! dcache_invd (gr_get_dcache ());
if (step)
{
Index: remote-nindy.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-nindy.c,v
retrieving revision 1.6
diff -c -r1.6 remote-nindy.c
*** remote-nindy.c 2000/08/10 18:54:27 1.6
--- remote-nindy.c 2000/08/18 22:40:18
***************
*** 191,197 ****
if (!nindy_dcache)
nindy_dcache = dcache_init (ninMemGet, ninMemPut);
else
! dcache_flush (nindy_dcache);
/* Allow user to interrupt the following -- we could hang if there's
no NINDY at the other end of the remote tty. */
--- 191,197 ----
if (!nindy_dcache)
nindy_dcache = dcache_init (ninMemGet, ninMemPut);
else
! dcache_invd (nindy_dcache);
/* Allow user to interrupt the following -- we could hang if there's
no NINDY at the other end of the remote tty. */
***************
*** 269,275 ****
if (siggnal != TARGET_SIGNAL_0 && siggnal != stop_signal)
warning ("Can't send signals to remote NINDY targets.");
! dcache_flush (nindy_dcache);
if (regs_changed)
{
nindy_store_registers (-1);
--- 269,275 ----
if (siggnal != TARGET_SIGNAL_0 && siggnal != stop_signal)
warning ("Can't send signals to remote NINDY targets.");
! dcache_invd (nindy_dcache);
if (regs_changed)
{
nindy_store_registers (-1);
***************
*** 614,619 ****
--- 614,621 ----
}
}
bfd_close (file);
+
+ dcache_invd(nindy_dcache);
}
static int
Index: remote-sds.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-sds.c,v
retrieving revision 1.5
diff -c -r1.5 remote-sds.c
*** remote-sds.c 2000/08/10 18:54:27 1.5
--- remote-sds.c 2000/08/18 22:40:19
***************
*** 206,212 ****
if (!sds_dcache)
sds_dcache = dcache_init (sds_read_bytes, sds_write_bytes);
else
! dcache_flush (sds_dcache);
sds_desc = SERIAL_OPEN (name);
if (!sds_desc)
--- 206,212 ----
if (!sds_dcache)
sds_dcache = dcache_init (sds_read_bytes, sds_write_bytes);
else
! dcache_invd (sds_dcache);
sds_desc = SERIAL_OPEN (name);
if (!sds_desc)
***************
*** 358,364 ****
{
unsigned char buf[PBUFSIZ];
! dcache_flush (sds_dcache);
last_sent_signal = siggnal;
last_sent_step = step;
--- 358,364 ----
{
unsigned char buf[PBUFSIZ];
! dcache_invd (sds_dcache);
last_sent_signal = siggnal;
last_sent_step = step;
Index: remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-utils.c,v
retrieving revision 1.5
diff -c -r1.5 remote-utils.c
*** remote-utils.c 2000/08/10 18:54:27 1.5
--- remote-utils.c 2000/08/18 22:40:19
***************
*** 165,171 ****
if ((dcache = gr_get_dcache()) == NULL)
gr_set_dcache (dcache_init (gr->readfunc, gr->writefunc));
else
! dcache_flush (dcache);
if (sr_get_desc () != NULL)
gr_close (0);
--- 165,171 ----
if ((dcache = gr_get_dcache()) == NULL)
gr_set_dcache (dcache_init (gr->readfunc, gr->writefunc));
else
! dcache_invd (dcache);
if (sr_get_desc () != NULL)
gr_close (0);
Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.20
diff -c -r1.20 remote.c
*** remote.c 2000/08/10 18:54:27 1.20
--- remote.c 2000/08/18 22:40:23
***************
*** 2060,2066 ****
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
! dcache_flush (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
--- 2060,2066 ----
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
! dcache_invd (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
***************
*** 2309,2315 ****
else
set_thread (pid, 0); /* run this thread */
! dcache_flush (remote_dcache);
last_sent_signal = siggnal;
last_sent_step = step;
--- 2309,2315 ----
else
set_thread (pid, 0); /* run this thread */
! dcache_invd (remote_dcache);
last_sent_signal = siggnal;
last_sent_step = step;
***************
*** 2343,2349 ****
else
set_thread (pid, 0); /* run this thread */
! dcache_flush (remote_dcache);
last_sent_signal = siggnal;
last_sent_step = step;
--- 2343,2349 ----
else
set_thread (pid, 0); /* run this thread */
! dcache_invd (remote_dcache);
last_sent_signal = siggnal;
last_sent_step = step;
***************
*** 5040,5046 ****
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
! dcache_flush (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
--- 5040,5046 ----
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
! dcache_invd (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
Index: wince.c
===================================================================
RCS file: /cvs/src/src/gdb/wince.c,v
retrieving revision 1.8
diff -c -r1.8 wince.c
*** wince.c 2000/07/30 01:48:28 1.8
--- wince.c 2000/08/18 22:40:25
***************
*** 1732,1738 ****
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
! dcache_flush (remote_dcache);
exec_file = upload_to_device (exec_file, exec_file);
--- 1732,1738 ----
if (!remote_dcache)
remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
else
! dcache_invd (remote_dcache);
exec_file = upload_to_device (exec_file, exec_file);
***************
*** 1842,1848 ****
th->context.ContextFlags = 0;
}
! dcache_flush (remote_dcache);
/* Allow continuing with the same signal that interrupted us.
Otherwise complain. */
--- 1842,1848 ----
th->context.ContextFlags = 0;
}
! dcache_invd (remote_dcache);
/* Allow continuing with the same signal that interrupted us.
Otherwise complain. */
--
J.T. Conklin
RedBack Networks
From kettenis@wins.uva.nl Fri Aug 18 16:08:00 2000
From: Mark Kettenis <kettenis@wins.uva.nl>
To: jtc@redback.com
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH]: more dcache cleanup
Date: Fri, 18 Aug 2000 16:08:00 -0000
Message-id: <200008182308.e7IN8A902200@delius.kettenis.local>
References: <5mlmxuxk11.fsf@jtc.redback.com>
X-SW-Source: 2000-08/msg00272.html
Content-length: 577
From: jtc@redback.com (J.T. Conklin)
Date: 18 Aug 2000 15:48:58 -0700
Enclosed is a patch that I'll be committing shortly.
The bulk of it is renaming "dcache_flush" to the less ambigous
"dcache_invd". It also fixes a problem where the cache wasn't
invalidated when a new image was loaded with the nindy monitor,
and a problem where the dcache i/o functions were different for
different ROM monitors.
Sorry, I can't resist; dcache_invd sounds pretty cryptic to me. Any
chance of changing it to dcache_invalidate before committing the
patch?
Mark
From jtc@redback.com Fri Aug 18 16:48:00 2000
From: jtc@redback.com (J.T. Conklin)
To: Mark Kettenis <kettenis@wins.uva.nl>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH]: more dcache cleanup
Date: Fri, 18 Aug 2000 16:48:00 -0000
Message-id: <5mg0o2xhaa.fsf@jtc.redback.com>
References: <5mlmxuxk11.fsf@jtc.redback.com> <200008182308.e7IN8A902200@delius.kettenis.local>
X-SW-Source: 2000-08/msg00273.html
Content-length: 1064
>>>>> "Mark" == Mark Kettenis <kettenis@wins.uva.nl> writes:
Mark> Enclosed is a patch that I'll be committing shortly.
Make>
Mark> The bulk of it is renaming "dcache_flush" to the less ambigous
Mark> "dcache_invd". It also fixes a problem where the cache wasn't
Mark> invalidated when a new image was loaded with the nindy monitor,
Mark> and a problem where the dcache i/o functions were different for
Mark> different ROM monitors.
Mark>
Mark> Sorry, I can't resist; dcache_invd sounds pretty cryptic to me. Any
Mark> chance of changing it to dcache_invalidate before committing the
Mark> patch?
Sorry, a bit too late for that, although there is nothing preventing
renaming it once again.
I was thinking about the invd and wbinvd x86 instructions when I
picked the name.
In an earlier message, I trolled for opinions wrt. dcache_invalidate
vs. dcache_invd and got no bites, so I opted for the shorter name.
Any other opinions? If I change the names, I only want to do it once
more...
--jtc
--
J.T. Conklin
RedBack Networks
From kettenis@wins.uva.nl Sat Aug 19 15:57:00 2000
From: Mark Kettenis <kettenis@wins.uva.nl>
To: gdb-patches@sourceware.cygnus.com
Cc: msnyder@cygnus.com
Subject: Re: [RFA] Re: Linux threads improvements
Date: Sat, 19 Aug 2000 15:57:00 -0000
Message-id: <200008192257.e7JMvN700686@delius.kettenis.local>
References: <200004240026.e3O0Qfl04183@delius.kettenis.local> <39047382.5B85@cygnus.com>
X-SW-Source: 2000-08/msg00274.html
Content-length: 3347
Hereby I withdraw the following patch:
2000-04-25 Mark Kettenis <kettenis@gnu.org>
Make Linux libthread_db-assisted thread debuging module use GDB's
internal thread list instead of rolling its own. Take advantage
of the thread event reporting facility, and make it handle exiting
threads. Improve documentation and do some minor cleanups.
* lin-thread.c (struct private_thread_info): New definition.
(supply_gregset, fill_gregset, supply_fpregset, fill_fpregset):
Add missing prototypes.
(struct ps_prochandle): Change type of pid member to `pid_t'. Add
member stopped.
(THREADINFO, threadinfo): Removed struct and typedef.
(threadlist, threadlist_max, threadlist_top): Removed variables.
(THREADLIST_ALLOC): Removed define.
(insert_thread, empty_threadlist, next_pending_event,
threadlist_iter): Removed functions.
(pid_to_thread, pid_to_lwp): New functions.
(attach_pid): Removed.
(enable_thread_event_reporting): Disable TD_DEATH event
reporting. Cast notify.ubptaddr to CORE_ADDR where necessary.
(check_for_thread_event): Removed function.
(thread_db_unpush_target): Add prototype for
linuxthreads_discard_global_state.
(thread_db_new_objfile): Adapt to use GDB's internal thread list.
(thread_db_pid_to_str): Cast thread id to `long'. Adapt printf
format string accordingly.
(handle_new_thread): Removed. Moved functionality into ...
(add_new_thread): ... new function.
(find_new_threads_callback, new_resume_thread_callback): Removed.
Moved functionality into ...
(td_find_new_threads_callback): ... new function.
(thread_db_find_new_threads): Rewrite to use GDB's internal thread
list and td_find_new_threads_callback callback function.
(thread_resume_callback): Moved functionality into ...
(resume_callback): ... new function.
(last_resume_pid, last_resume_step, last_resume_signo): Removed
variables.
(thread_db_resume): Rename to ...
(lin_thread_resume): ... and rewrite to use GDB's internal thread
list and resume_callback callback function.
(stop_or_attach_thread_callback): Removed. Moved part of the
functionality into ...
(stop_callback): ... new function. Only stops a thread.
(wait_for_stop): Change type of argument to `lwpid_t'. Add code
to deal with exiting threads.
(wait_thread_callback): Removed. Moved functionality into ...
(wait_callback): ... new function.
(delete_old_thread): New function.
(check_event): New function.
(child_wait): New function.
(lin_thread_wait): Renamed from thread_db_wait. Reimplemented to
use GDB's internal thread list. Adapt to deal with exiting
kernel threads.
(thread_db_mourn_inferior): Add call to
remove_thread_event_breakpoints.
(init_thread_db_ops): Use lin_thread_wait and lin_thread_resume
instead of thread_db_wait and thread_db_resume.
It still has too many problems, and I'm unable to fix those.
Instead I'm working on a new threads implementation for Linux. This
will provide two layers. The first layer is a low-level LWP layer
(almost finished, but there are some bugs in the core of GDB that I
need to fix) that provides some basic debugging functionality for
debugging multiple processes that share a VM space, which happends to
be Linux's threading model. On top of it I'll re-implement the
LinuxThreads library support. Once the low-level layer is stable,
that should be a piece of cake.
Mark
From troy@rollo.com Sat Aug 19 20:51:00 2000
From: Troy Rollo <troy@rollo.com>
To: gdb-patches@sourceware.cygnus.com
Subject: Borland TDS reading + BFD Interface Change
Date: Sat, 19 Aug 2000 20:51:00 -0000
Message-id: <4.3.1.2.20000820133938.00aa7100@mail>
X-SW-Source: 2000-08/msg00275.html
Content-type: multipart/mixed; boundary="----------=_1583534357-29877-18"
This is a multi-part message in MIME format...
------------=_1583534357-29877-18
Content-length: 2569
The attached patches and additional files (together with a patch I have
just sent for BFD) add support for Borland TDS debugging information to
GDB. I have been primarily concerned with TDS version 10 (which is used by
Borland's "Free" compiler), but have also got things working within
reasonable parameters for TDS version 9, which is used by Borland C++ 4.x
While I have added files to GDB before (in 1993), my understanding is I
still need to send another assignment agreement and employer disclaimer to
RMS because of the new files in this patch, so I will be putting that in
the mail tomorrow.
Specific things to be aware of:
1. I have included the Borland demangling as a module of GDB rather than
trying to get it into the common demangling code - that code appears to be
designed to deal with demangling formats that are fundamentally similar,
but Borland's bears no resemblence to any of those formats.
2. TDS stores partially mangled symbols - they often don't have the
arguments mangled in them. To get past this, I have made a call to
c_type_print_args when necessary to put the arguments into the C++
demangled name. This of course entailed making c_type_print_args non-static.
3. There was a bug in main.c that meant that the --symbols command line
argument was effectively ignored in any practical case. I had to fix that
because we need the --symbols argument for TDS, because the debug
information may be in a sepearate file to the executable.
4. Binutils interface change - In the BFD structure I have added a data
element "opened_for_symbols" - because TDS data may or may not be in the
same file as an executable, and we need to recognise the executable in one
case and the debug information in another, I added this member that the
Borland TDS recognition code checks before deciding if it matches.
5. Almost everything else should be reasonably kosher as far as
modifications to existing files go.
I use the following shell script to launch GDB for Borland files - it may
be useful to people who are going to do this, but I'm not sure if it
belongs anywhere in the GDB source tree itself.
#!/bin/sh
GNUTARGET=borland-tds
export GNUTARGET
GDB=/usr/local/bin/gdb
case "x$1" in
x)
;;
*)
[ -f "$1.tds" ] && {
exec ${GDB} --symbols="$1.tds" "$@"
}
;;
esac
exec ${GDB} "$@"
diffs
gdbnewfiles.tar.gz
______________________________________________________________________________
troy@rollo.com Troy Rollo, Sydney, Australia
Fight spam in Australia - Join CAUBE.AU - http://www.caube.org.au/
------------=_1583534357-29877-18
Content-Type: text/x-diff; charset=us-ascii; name="diffs"
Content-Disposition: inline; filename="diffs"
Content-Transfer-Encoding: base64
Content-Length: 14372
ZGlmZiAtcnUgZ2RiLTIwMDAwNjEwL2dkYi9NYWtlZmlsZS5pbiBnZGItbmV3
L2dkYi9NYWtlZmlsZS5pbgotLS0gZ2RiLTIwMDAwNjEwL2dkYi9NYWtlZmls
ZS5pbglUaHUgSnVuICA4IDEzOjMxOjA4IDIwMDAKKysrIGdkYi1uZXcvZ2Ri
L01ha2VmaWxlLmluCVN1biBBdWcgMjAgMTI6NDM6NTAgMjAwMApAQCAtMTA2
OCw3ICsxMDY4LDcgQEAKIAlhcm0tbGludXgtbmF0LmMgYXJtLWxpbnV4LXRk
ZXAuYyBhcm0tdGRlcC5jIGFybS14ZGVwLmMgXAogCWNvZmYtc29saWIuYyBj
b252ZXgtdGRlcC5jIGNvbnZleC14ZGVwLmMgXAogCWNvcmUtc29sMi5jIGNv
cmUtcmVnc2V0LmMgY29yZS1hb3V0LmMgY29yZWxvdy5jIFwKLQlkY2FjaGUu
YyBkZWx0YTY4LW5hdC5jIGRweDItbmF0LmMgZHN0cmVhZC5jIGV4ZWMuYyBm
b3JrLWNoaWxkLmMgXAorCWRjYWNoZS5jIGRlbHRhNjgtbmF0LmMgZHB4Mi1u
YXQuYyBkc3RyZWFkLmMgdGRzcmVhZC5jIGV4ZWMuYyBmb3JrLWNoaWxkLmMg
XAogCWdvMzItbmF0LmMgaDgzMDAtdGRlcC5jIGg4NTAwLXRkZXAuYyBcCiAJ
aHAzMDB1eC1uYXQuYyBocHBhLXRkZXAuYyBocHBhYi1uYXQuYyBocHBhaC1u
YXQuYyBcCiAgICAgICAgIGhwLXBzeW10YWItcmVhZC5jIGhwLXN5bXRhYi1y
ZWFkLmMgXApkaWZmIC1ydSBnZGItMjAwMDA2MTAvZ2RiL2MtdHlwZXByaW50
LmMgZ2RiLW5ldy9nZGIvYy10eXBlcHJpbnQuYwotLS0gZ2RiLTIwMDAwNjEw
L2dkYi9jLXR5cGVwcmludC5jCVNhdCBGZWIgIDUgMTg6Mjk6NDAgMjAwMAor
KysgZ2RiLW5ldy9nZGIvYy10eXBlcHJpbnQuYwlTdW4gQXVnIDIwIDEyOjQ0
OjA4IDIwMDAKQEAgLTQ2LDcgKzQ2LDcgQEAKIAkJCQkgICAgICAgY2hhciAq
dmFyc3RyaW5nLCBpbnQgc3RhdGljcCwKIAkJCQkgICAgICAgc3RydWN0IHVp
X2ZpbGUgKnN0cmVhbSk7CiAKLXN0YXRpYyB2b2lkIGNfdHlwZV9wcmludF9h
cmdzIChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdWlfZmlsZSAqKTsKK3ZvaWQg
Y190eXBlX3ByaW50X2FyZ3MgKHN0cnVjdCB0eXBlICosIHN0cnVjdCB1aV9m
aWxlICopOwogCiBzdGF0aWMgdm9pZCBjcF90eXBlX3ByaW50X2Rlcml2YXRp
b25faW5mbyAoc3RydWN0IHVpX2ZpbGUgKiwgc3RydWN0IHR5cGUgKik7CiAK
QEAgLTM4NSw3ICszODUsNyBAQAogCiAKIAotc3RhdGljIHZvaWQKK3ZvaWQK
IGNfdHlwZV9wcmludF9hcmdzICh0eXBlLCBzdHJlYW0pCiAgICAgIHN0cnVj
dCB0eXBlICp0eXBlOwogICAgICBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtOwpk
aWZmIC1ydSBnZGItMjAwMDA2MTAvZ2RiL2NvbmZpZy9pMzg2L2N5Z3dpbi5t
aCBnZGItbmV3L2dkYi9jb25maWcvaTM4Ni9jeWd3aW4ubWgKLS0tIGdkYi0y
MDAwMDYxMC9nZGIvY29uZmlnL2kzODYvY3lnd2luLm1oCUZyaSBBcHIgMTYg
MTE6MzQ6MTggMTk5OQorKysgZ2RiLW5ldy9nZGIvY29uZmlnL2kzODYvY3ln
d2luLm1oCVN1biBBdWcgMjAgMTI6NDQ6NDQgMjAwMApAQCAtMSw2ICsxLDYg
QEAKIE1IX0NGTEFHUz0KIFhNX0ZJTEU9eG0tY3lnd2luLmgKIFhERVBGSUxF
Uz1zZXItdGNwLm8KLU5BVERFUEZJTEVTPSB3aW4zMi1uYXQubworTkFUREVQ
RklMRVM9IHdpbjMyLW5hdC5vIHRkc3JlYWQubyBib3JsZGVtLm8KIE5BVF9G
SUxFPS4uL25tLWVtcHR5LmgKIFhNX0NMSUJTPQpkaWZmIC1ydSBnZGItMjAw
MDA2MTAvZ2RiL2dkYnR5cGVzLmMgZ2RiLW5ldy9nZGIvZ2RidHlwZXMuYwot
LS0gZ2RiLTIwMDAwNjEwL2dkYi9nZGJ0eXBlcy5jCVN1biBNYXkgMjggMTE6
MTI6MjggMjAwMAorKysgZ2RiLW5ldy9nZGIvZ2RidHlwZXMuYwlTdW4gQXVn
IDIwIDEyOjQ1OjEwIDIwMDAKQEAgLTk1LDYgKzk1LDIyIEBACiBzdGF0aWMg
dm9pZCBwcmludF9jcGx1c19zdHVmZiAoc3RydWN0IHR5cGUgKiwgaW50KTsK
IHN0YXRpYyB2b2lkIHZpcnR1YWxfYmFzZV9saXN0X2F1eCAoc3RydWN0IHR5
cGUgKmRjbGFzcyk7CiAKKy8qIENlbnRyYWwgcGxhY2UgdG8gaW5pdGlhbGl6
ZSBhIHR5cGUgLSBiZWZvcmUgdGhpcyB3YXMgb25seSBkb25lCisgICBpbiBh
bGxvY190eXBlLCBidXQgdGhhdCdzIG5vdCB0aGUgb25seSBwbGFjZSBhIHR5
cGUgY2FuIGNvbWUKKyAgIGZyb20gKi8KKwordm9pZAoraW5pdF9lbXB0eV90
eXBlIChvYmpmaWxlLCB0eXBlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2Jq
ZmlsZTsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIG1lbXNldCAo
KGNoYXIgKikgdHlwZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkpOworICBU
WVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1VOREVGOworICBUWVBFX09C
SkZJTEUgKHR5cGUpID0gb2JqZmlsZTsKKyAgVFlQRV9WUFRSX0ZJRUxETk8g
KHR5cGUpID0gLTE7CisgIFRZUEVfQ1ZfVFlQRSAodHlwZSkgPSB0eXBlOwkv
KiBjaGFpbiBiYWNrIHRvIGl0c2VsZiAqLworfQorCiAKIC8qIEFsbG9jIGEg
bmV3IHR5cGUgc3RydWN0dXJlIGFuZCBmaWxsIGl0IHdpdGggc29tZSBkZWZh
dWx0cy4gIElmCiAgICBPQkpGSUxFIGlzIG5vbi1OVUxMLCB0aGVuIGFsbG9j
YXRlIHRoZSBzcGFjZSBmb3IgdGhlIHR5cGUgc3RydWN0dXJlCkBAIC0xMTgs
MTQgKzEzNCwxMCBAQAogCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkp
OwogICAgICAgT0JKU1RBVCAob2JqZmlsZSwgbl90eXBlcysrKTsKICAgICB9
Ci0gIG1lbXNldCAoKGNoYXIgKikgdHlwZSwgMCwgc2l6ZW9mIChzdHJ1Y3Qg
dHlwZSkpOwogCiAgIC8qIEluaXRpYWxpemUgdGhlIGZpZWxkcyB0aGF0IG1p
Z2h0IG5vdCBiZSB6ZXJvLiAqLwogCi0gIFRZUEVfQ09ERSAodHlwZSkgPSBU
WVBFX0NPREVfVU5ERUY7Ci0gIFRZUEVfT0JKRklMRSAodHlwZSkgPSBvYmpm
aWxlOwotICBUWVBFX1ZQVFJfRklFTEROTyAodHlwZSkgPSAtMTsKLSAgVFlQ
RV9DVl9UWVBFICh0eXBlKSA9IHR5cGU7CS8qIGNoYWluIGJhY2sgdG8gaXRz
ZWxmICovCisgIGluaXRfZW1wdHlfdHlwZSAob2JqZmlsZSwgdHlwZSk7CiAK
ICAgcmV0dXJuICh0eXBlKTsKIH0KQEAgLTE0MSw3ICsxNTMsNiBAQAogICAg
ICBzdHJ1Y3QgdHlwZSAqKnR5cGVwdHI7CiB7CiAgIHJlZ2lzdGVyIHN0cnVj
dCB0eXBlICpudHlwZTsJLyogTmV3IHR5cGUgKi8KLSAgc3RydWN0IG9iamZp
bGUgKm9iamZpbGU7CiAKICAgbnR5cGUgPSBUWVBFX1BPSU5URVJfVFlQRSAo
dHlwZSk7CiAKQEAgLTE2Niw5ICsxNzcsNyBAQAogICAgIC8qIFdlIGhhdmUg
c3RvcmFnZSwgYnV0IG5lZWQgdG8gcmVzZXQgaXQuICAqLwogICAgIHsKICAg
ICAgIG50eXBlID0gKnR5cGVwdHI7Ci0gICAgICBvYmpmaWxlID0gVFlQRV9P
QkpGSUxFIChudHlwZSk7Ci0gICAgICBtZW1zZXQgKChjaGFyICopIG50eXBl
LCAwLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7Ci0gICAgICBUWVBFX09CSkZJ
TEUgKG50eXBlKSA9IG9iamZpbGU7CisgICAgICBpbml0X2VtcHR5X3R5cGUg
KFRZUEVfT0JKRklMRSAobnR5cGUpLCBudHlwZSk7CiAgICAgfQogCiAgIFRZ
UEVfVEFSR0VUX1RZUEUgKG50eXBlKSA9IHR5cGU7CkBAIC0yMzQsOSArMjQz
LDcgQEAKICAgICAvKiBXZSBoYXZlIHN0b3JhZ2UsIGJ1dCBuZWVkIHRvIHJl
c2V0IGl0LiAgKi8KICAgICB7CiAgICAgICBudHlwZSA9ICp0eXBlcHRyOwot
ICAgICAgb2JqZmlsZSA9IFRZUEVfT0JKRklMRSAobnR5cGUpOwotICAgICAg
bWVtc2V0ICgoY2hhciAqKSBudHlwZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgdHlw
ZSkpOwotICAgICAgVFlQRV9PQkpGSUxFIChudHlwZSkgPSBvYmpmaWxlOwor
ICAgICAgaW5pdF9lbXB0eV90eXBlIChUWVBFX09CSkZJTEUgKG50eXBlKSwg
bnR5cGUpOwogICAgIH0KIAogICBUWVBFX1RBUkdFVF9UWVBFIChudHlwZSkg
PSB0eXBlOwpAQCAtMjc0LDcgKzI4MSw2IEBACiAgICAgIHN0cnVjdCB0eXBl
ICoqdHlwZXB0cjsKIHsKICAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKm50eXBl
OwkvKiBOZXcgdHlwZSAqLwotICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsK
IAogICBpZiAodHlwZXB0ciA9PSAwIHx8ICp0eXBlcHRyID09IDApCS8qIFdl
J2xsIG5lZWQgdG8gYWxsb2NhdGUgb25lLiAgKi8KICAgICB7CkBAIC0yODYs
OSArMjkyLDcgQEAKICAgICAvKiBXZSBoYXZlIHN0b3JhZ2UsIGJ1dCBuZWVk
IHRvIHJlc2V0IGl0LiAgKi8KICAgICB7CiAgICAgICBudHlwZSA9ICp0eXBl
cHRyOwotICAgICAgb2JqZmlsZSA9IFRZUEVfT0JKRklMRSAobnR5cGUpOwot
ICAgICAgbWVtc2V0ICgoY2hhciAqKSBudHlwZSwgMCwgc2l6ZW9mIChzdHJ1
Y3QgdHlwZSkpOwotICAgICAgVFlQRV9PQkpGSUxFIChudHlwZSkgPSBvYmpm
aWxlOworICAgICAgaW5pdF9lbXB0eV90eXBlIChUWVBFX09CSkZJTEUgKG50
eXBlKSwgbnR5cGUpOwogICAgIH0KIAogICBUWVBFX1RBUkdFVF9UWVBFIChu
dHlwZSkgPSB0eXBlOwpAQCAtMzMwLDcgKzMzNCw2IEBACiB7CiAgIHJlZ2lz
dGVyIHN0cnVjdCB0eXBlICpudHlwZTsJLyogTmV3IHR5cGUgKi8KICAgcmVn
aXN0ZXIgc3RydWN0IHR5cGUgKnRtcF90eXBlID0gdHlwZTsJLyogdG1wIHR5
cGUgKi8KLSAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CiAKICAgbnR5cGUg
PSBUWVBFX0NWX1RZUEUgKHR5cGUpOwogCkBAIC0zNTgsMTIgKzM2MSwxMyBA
QAogCSp0eXBlcHRyID0gbnR5cGU7CiAgICAgfQogICBlbHNlCi0gICAgLyog
V2UgaGF2ZSBzdG9yYWdlLCBidXQgbmVlZCB0byByZXNldCBpdC4gICovCisg
ICAgLyogV2UgaGF2ZSBzdG9yYWdlIC0gd2UgZG8gTk9UIG5lZWQgdG8gcmVz
ZXQgaXQgaGVyZSAtIHRoZSBtZW1jcHkKKyAgICAgICBiZWxvdyB3aWxsIG92
ZXJ3cml0ZSBpdC4KKyAgICAgICBGSVhNRSAtIG1ha2VfcG9pbnRlcl90eXBl
IGFuZCBtYWtlX3JlZmVyZW5jZV90eXBlIHByZXNlcnZlCisgICAgICAgbnR5
cGUtPm9iamZpbGUsIGJ1dCBtYWtlX2N2X3R5cGUgY29waWVzIGl0IGZyb20g
dHlwZS0+b2JqZmlsZS4KKyAgICAgICB3aGljaCBpcyBjb3JyZWN0PyAgKi8K
ICAgICB7CiAgICAgICBudHlwZSA9ICp0eXBlcHRyOwotICAgICAgb2JqZmls
ZSA9IFRZUEVfT0JKRklMRSAobnR5cGUpOwotICAgICAgLyogbWVtc2V0ICgo
Y2hhciAqKSBudHlwZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkpOyAqLwot
ICAgICAgVFlQRV9PQkpGSUxFIChudHlwZSkgPSBvYmpmaWxlOwogICAgIH0K
IAogICAvKiBDb3B5IG9yaWdpbmFsIHR5cGUgKi8KQEAgLTY5NiwxMiArNzAw
LDcgQEAKICAgICAgc3RydWN0IHR5cGUgKmRvbWFpbjsKICAgICAgc3RydWN0
IHR5cGUgKnRvX3R5cGU7CiB7Ci0gIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxl
OwotCi0gIG9iamZpbGUgPSBUWVBFX09CSkZJTEUgKHR5cGUpOwotCi0gIG1l
bXNldCAoKGNoYXIgKikgdHlwZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkp
OwotICBUWVBFX09CSkZJTEUgKHR5cGUpID0gb2JqZmlsZTsKKyAgaW5pdF9l
bXB0eV90eXBlIChUWVBFX09CSkZJTEUgKHR5cGUpLCB0eXBlKTsKICAgVFlQ
RV9UQVJHRVRfVFlQRSAodHlwZSkgPSB0b190eXBlOwogICBUWVBFX0RPTUFJ
Tl9UWVBFICh0eXBlKSA9IGRvbWFpbjsKICAgVFlQRV9MRU5HVEggKHR5cGUp
ID0gMTsJLyogSW4gcHJhY3RpY2UsIHRoaXMgaXMgbmV2ZXIgbmVlZGVkLiAg
Ki8KQEAgLTcyMiwxMiArNzIxLDcgQEAKICAgICAgc3RydWN0IHR5cGUgKnRv
X3R5cGU7CiAgICAgIHN0cnVjdCB0eXBlICoqYXJnczsKIHsKLSAgc3RydWN0
IG9iamZpbGUgKm9iamZpbGU7Ci0KLSAgb2JqZmlsZSA9IFRZUEVfT0JKRklM
RSAodHlwZSk7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSB0eXBlLCAwLCBzaXpl
b2YgKHN0cnVjdCB0eXBlKSk7Ci0gIFRZUEVfT0JKRklMRSAodHlwZSkgPSBv
YmpmaWxlOworICBpbml0X2VtcHR5X3R5cGUgKFRZUEVfT0JKRklMRSAodHlw
ZSksIHR5cGUpOwogICBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSA9IHRvX3R5
cGU7CiAgIFRZUEVfRE9NQUlOX1RZUEUgKHR5cGUpID0gZG9tYWluOwogICBU
WVBFX0FSR19UWVBFUyAodHlwZSkgPSBhcmdzOwpAQCAtMTY0NSw2ICsxNjM5
LDcgQEAKIHsKICAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKip0eXBlcDsKICAg
cmVnaXN0ZXIgaW50IG5ieXRlczsKKyAgaW50IGk7CiAKICAgaWYgKHR5cGVp
ZCA8IDAgfHwgdHlwZWlkID49IEZUX05VTV9NRU1CRVJTKQogICAgIHsKQEAg
LTE2NTksNyArMTY1NCw3IEBACiAgICAgICBuYnl0ZXMgPSBGVF9OVU1fTUVN
QkVSUyAqIHNpemVvZiAoc3RydWN0IHR5cGUgKik7CiAgICAgICBvYmpmaWxl
LT5mdW5kYW1lbnRhbF90eXBlcyA9IChzdHJ1Y3QgdHlwZSAqKikKIAlvYnN0
YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCBuYnl0ZXMpOwot
ICAgICAgbWVtc2V0ICgoY2hhciAqKSBvYmpmaWxlLT5mdW5kYW1lbnRhbF90
eXBlcywgMCwgbmJ5dGVzKTsKKyAgICAgIG1lbXNldCAob2JqZmlsZS0+ZnVu
ZGFtZW50YWxfdHlwZXMsIDAsIG5ieXRlcyk7CiAgICAgICBPQkpTVEFUIChv
YmpmaWxlLCBuX3R5cGVzICs9IEZUX05VTV9NRU1CRVJTKTsKICAgICB9CiAK
ZGlmZiAtcnUgZ2RiLTIwMDAwNjEwL2dkYi9nZGJ0eXBlcy5oIGdkYi1uZXcv
Z2RiL2dkYnR5cGVzLmgKLS0tIGdkYi0yMDAwMDYxMC9nZGIvZ2RidHlwZXMu
aAlTdW4gTWF5IDI4IDExOjEyOjI4IDIwMDAKKysrIGdkYi1uZXcvZ2RiL2dk
YnR5cGVzLmgJU2F0IEF1ZyAxOSAxMjo0ODoyNCAyMDAwCkBAIC05NDcsNiAr
OTQ3LDggQEAKIAogZXh0ZXJuIHN0cnVjdCB0eXBlICphbGxvY190eXBlIChz
dHJ1Y3Qgb2JqZmlsZSAqKTsKIAorZXh0ZXJuIHZvaWQgaW5pdF9lbXB0eV90
eXBlIChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSwgc3RydWN0IHR5cGUgKnR5
cGUpOworCiBleHRlcm4gc3RydWN0IHR5cGUgKmluaXRfdHlwZSAoZW51bSB0
eXBlX2NvZGUsIGludCwgaW50LCBjaGFyICosCiAJCQkgICAgICAgc3RydWN0
IG9iamZpbGUgKik7CiAKZGlmZiAtcnUgZ2RiLTIwMDAwNjEwL2dkYi9tYWlu
LmMgZ2RiLW5ldy9nZGIvbWFpbi5jCi0tLSBnZGItMjAwMDA2MTAvZ2RiL21h
aW4uYwlTdW4gTWF5IDI4IDExOjEyOjI4IDIwMDAKKysrIGdkYi1uZXcvZ2Ri
L21haW4uYwlTYXQgQXVnIDE5IDEyOjQ4OjIwIDIwMDAKQEAgLTQ3MCw3ICs0
NzAsOCBAQAogICAgICAgc3dpdGNoICgrK2NvdW50KQogCXsKIAljYXNlIDE6
Ci0JICBzeW1hcmcgPSBhcmd2W29wdGluZF07CisJICBpZiAoIXN5bWFyZykg
LyogLS1zeW1ib2xzIHNob3VsZCB0YWtlIHByZWNlZGVuY2UhICovCisJICAg
IHN5bWFyZyA9IGFyZ3Zbb3B0aW5kXTsKIAkgIGV4ZWNhcmcgPSBhcmd2W29w
dGluZF07CiAJICBicmVhazsKIAljYXNlIDI6Ck9ubHkgaW4gZ2RiLW5ldy9n
ZGI6IG1haW4ubwpPbmx5IGluIGdkYi1uZXcvZ2RiOiBtYWludC5vCk9ubHkg
aW4gZ2RiLW5ldy9nZGI6IG1kZWJ1Z3JlYWQubwpPbmx5IGluIGdkYi1uZXcv
Z2RiOiBtZW0tYnJlYWsubwpkaWZmIC1ydSBnZGItMjAwMDA2MTAvZ2RiL21p
bnN5bXMuYyBnZGItbmV3L2dkYi9taW5zeW1zLmMKLS0tIGdkYi0yMDAwMDYx
MC9nZGIvbWluc3ltcy5jCVN1biBNYXkgMjggMTE6MTI6MjggMjAwMAorKysg
Z2RiLW5ldy9nZGIvbWluc3ltcy5jCVN1biBBdWcgMjAgMTI6NDU6MzIgMjAw
MApAQCAtNTkzLDcgKzU5Myw3IEBACiAgIG1zeW1fYnVuY2hfaW5kZXggPSBC
VU5DSF9TSVpFOwogfQogCi12b2lkCitzdHJ1Y3QgbWluaW1hbF9zeW1ib2wg
KgogcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgKG5hbWUsIGFkZHJlc3Ms
IG1zX3R5cGUsIG9iamZpbGUpCiAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAg
ICAgIENPUkVfQUREUiBhZGRyZXNzOwpAQCAtNjIxLDggKzYyMSw4IEBACiAg
ICAgICBzZWN0aW9uID0gLTE7CiAgICAgfQogCi0gIHByaW1fcmVjb3JkX21p
bmltYWxfc3ltYm9sX2FuZF9pbmZvIChuYW1lLCBhZGRyZXNzLCBtc190eXBl
LAotCQkJCSAgICAgICBOVUxMLCBzZWN0aW9uLCBOVUxMLCBvYmpmaWxlKTsK
KyAgcmV0dXJuIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZv
IChuYW1lLCBhZGRyZXNzLCBtc190eXBlLAorCQkJCQkgICAgICBOVUxMLCBz
ZWN0aW9uLCBOVUxMLCBvYmpmaWxlKTsKIH0KIAogLyogUmVjb3JkIGEgbWlu
aW1hbCBzeW1ib2wgaW4gdGhlIG1zeW0gYnVuY2hlcy4gIFJldHVybnMgdGhl
IHN5bWJvbApAQCAtOTAyLDcgKzkwMiwxMSBAQAogCSAgZm9yIChiaW5kZXgg
PSAwOyBiaW5kZXggPCBtc3ltX2J1bmNoX2luZGV4OyBiaW5kZXgrKywgbWNv
dW50KyspCiAJICAgIHsKIAkgICAgICBtc3ltYm9sc1ttY291bnRdID0gYnVu
Y2gtPmNvbnRlbnRzW2JpbmRleF07Ci0JICAgICAgU1lNQk9MX0xBTkdVQUdF
ICgmbXN5bWJvbHNbbWNvdW50XSkgPSBsYW5ndWFnZV9hdXRvOworCSAgICAg
IC8qIERvbid0IHNldCB0aGUgc3ltYm9sIGxhbmd1YWdlIHRvIGF1dG8gaWYg
dGhlIHN5bWJvbAorCQkgcmVhZGVyIHNldCBpdCBhbHJlYWR5IC0gd2UgbWF5
IGJlIHRocm93aW5nIG91dAorCQkgaW1wb3J0YW50IGluZm9ybWF0aW9uICov
CisJICAgICAgaWYgKFNZTUJPTF9MQU5HVUFHRSAoJm1zeW1ib2xzW21jb3Vu
dF0pID09IGxhbmd1YWdlX3Vua25vd24pCisJCVNZTUJPTF9MQU5HVUFHRSAo
Jm1zeW1ib2xzW21jb3VudF0pID0gbGFuZ3VhZ2VfYXV0bzsKIAkgICAgICBp
ZiAoU1lNQk9MX05BTUUgKCZtc3ltYm9sc1ttY291bnRdKVswXSA9PSBsZWFk
aW5nX2NoYXIpCiAJCXsKIAkJICBTWU1CT0xfTkFNRSAoJm1zeW1ib2xzW21j
b3VudF0pKys7CkBAIC05NTIsMTAgKzk1NiwxNSBAQAogCiAgICAgICBmb3Ig
KDsgbWNvdW50LS0gPiAwOyBtc3ltYm9scysrKQogCXsKLQkgIFNZTUJPTF9J
TklUX0RFTUFOR0xFRF9OQU1FIChtc3ltYm9scywgJm9iamZpbGUtPnN5bWJv
bF9vYnN0YWNrKTsKKwkgIC8qIERvbid0IGRlbWFuZ2xlIGFnYWluIGlmIHRo
ZSBzeW1ib2wgdGFibGUgcmVhZGVyIGRpZCBpdAorCSAgICAgYWxyZWFkeSAt
IHRoZSBzeW1ib2wgdGFibGUgcmVhZGVyIHByb2JhYmx5IGtub3dzIGJlc3QK
KwkgICAgIGhvdyB0byBkZW1hbmdsZSBhIHN5bWJvbCBpdCByZWFkcyBpbiEg
Ki8KKwkgIGlmIChTWU1CT0xfREVNQU5HTEVEX05BTUUgKG1zeW1ib2xzKSA9
PSBOVUxMCisJICAgICAgfHwgU1lNQk9MX0RFTUFOR0xFRF9OQU1FIChtc3lt
Ym9scykgPT0gU1lNQk9MX05BTUUgKG1zeW1ib2xzKSkKKwkgICAgU1lNQk9M
X0lOSVRfREVNQU5HTEVEX05BTUUgKG1zeW1ib2xzLCAmb2JqZmlsZS0+c3lt
Ym9sX29ic3RhY2spOwogCSAgaWYgKFNZTUJPTF9ERU1BTkdMRURfTkFNRSAo
bXN5bWJvbHMpICE9IE5VTEwpCi0gICAgICAgICAgYWRkX21pbnN5bV90b19k
ZW1hbmdsZWRfaGFzaF90YWJsZSAobXN5bWJvbHMsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZmlsZS0+bXN5
bWJvbF9kZW1hbmdsZWRfaGFzaCk7CisgICAgICAgICAgICBhZGRfbWluc3lt
X3RvX2RlbWFuZ2xlZF9oYXNoX3RhYmxlIChtc3ltYm9scywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZp
bGUtPm1zeW1ib2xfZGVtYW5nbGVkX2hhc2gpOwogCX0KICAgICB9CiB9CmRp
ZmYgLXJ1IGdkYi0yMDAwMDYxMC9nZGIvc3ltZmlsZS5jIGdkYi1uZXcvZ2Ri
L3N5bWZpbGUuYwotLS0gZ2RiLTIwMDAwNjEwL2dkYi9zeW1maWxlLmMJU3Vu
IEp1biAgNCAxMDo0MToxMCAyMDAwCisrKyBnZGItbmV3L2dkYi9zeW1maWxl
LmMJU3VuIEF1ZyAyMCAxMjo0NjoxMiAyMDAwCkBAIC0xMDk0LDYgKzEwOTQs
NyBAQAogICAvKiBJdCdsbCBiZSBmcmVlZCBpbiBmcmVlX29iamZpbGUoKS4g
Ki8KIAogICBzeW1fYmZkID0gYmZkX2Zkb3BlbnIgKG5hbWUsIGdudXRhcmdl
dCwgZGVzYyk7CisgIHN5bV9iZmQtPm9wZW5lZF9mb3Jfc3ltYm9scyA9IHRy
dWU7CiAgIGlmICghc3ltX2JmZCkKICAgICB7CiAgICAgICBjbG9zZSAoZGVz
Yyk7CmRpZmYgLXJ1IGdkYi0yMDAwMDYxMC9nZGIvc3ltdGFiLmggZ2RiLW5l
dy9nZGIvc3ltdGFiLmgKLS0tIGdkYi0yMDAwMDYxMC9nZGIvc3ltdGFiLmgJ
VHVlIEp1biAgNiAwNjo0OTo1NCAyMDAwCisrKyBnZGItbmV3L2dkYi9zeW10
YWIuaAlTYXQgQXVnIDE5IDEyOjU4OjMwIDIwMDAKQEAgLTExOTgsOSArMTE5
OCwxMCBAQAogLyogRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIG1p
bmltYWwgc3ltYm9sIHRhYmxlLCByZWFsbHkgYSBtaXNjCiAgICBhZGRyZXNz
PC0+c3ltYm9sIG1hcHBpbmcgZm9yIHRoaW5ncyB3ZSBkb24ndCBoYXZlIGRl
YnVnIHN5bWJvbHMgZm9yLiAgKi8KIAotZXh0ZXJuIHZvaWQgcHJpbV9yZWNv
cmRfbWluaW1hbF9zeW1ib2wgKGNvbnN0IGNoYXIgKiwgQ09SRV9BRERSLAot
CQkJCQllbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUsCi0JCQkJCXN0cnVjdCBv
YmpmaWxlICopOworZXh0ZXJuIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqIHBy
aW1fcmVjb3JkX21pbmltYWxfc3ltYm9sCisgIChjb25zdCBjaGFyICosIENP
UkVfQUREUiwKKyAgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSwKKyAgIHN0
cnVjdCBvYmpmaWxlICopOwogCiBleHRlcm4gc3RydWN0IG1pbmltYWxfc3lt
Ym9sICpwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbwogICAo
Y29uc3QgY2hhciAqLCBDT1JFX0FERFIsCgo=
------------=_1583534357-29877-18
Content-Type: application/x-gzip; charset=binary; name="gdbnewfiles.tar.gz"
Content-Disposition: inline; filename="gdbnewfiles.tar.gz"
Content-Transfer-Encoding: base64
Content-Length: 32855
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
9fnr89fnr89fn78+f33+Cz//H9gkPc0AuAEA
------------=_1583534357-29877-18--
From dan@cgsoftware.com Sat Aug 19 21:14:00 2000
From: Daniel Berlin <dan@cgsoftware.com>
To: Troy Rollo <troy@rollo.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: Borland TDS reading + BFD Interface Change
Date: Sat, 19 Aug 2000 21:14:00 -0000
Message-id: <Pine.LNX.4.21.0008192109460.1354-100000@propylaea.anduin.com>
References: <4.3.1.2.20000820133938.00aa7100@mail>
X-SW-Source: 2000-08/msg00276.html
Content-length: 2722
> Specific things to be aware of:
>
> 1. I have included the Borland demangling as a module of GDB rather than
> trying to get it into the common demangling code - that code appears to be
> designed to deal with demangling formats that are fundamentally similar,
> but Borland's bears no resemblence to any of those formats.
Huh?
libiberty's demangler module provides a generic interface to demangling
any c++ symbol.
You should be able to add any type of demangler into it, no matter how
dissimilar.
Compaq C++, GNU, ARM, HP, EDG, java, GNAT, GNU new-abi all fit with it's
framework.
I've also fit a demangler for MS's mangling scheme in there before.
I don't see how borland's is so amazingly different that it can't be
included.
It makes it amazingly difficult to do useful C++ debugging if your
demangler must be called seperately. We need to simply be able to use
cplus_demangle, and get the right stuff back, no matter what the mangling
scheme used is.
Otherwise, you'll break so much it's not even funny.
Unless you never use a mangled name anywhere in your debug info.
And in the future, you'll break even more, as i add a lot more C++
functionality.
> > 2. TDS stores partially mangled symbols - they often don't have the
> arguments mangled in them. To get past this, I have made a call to
> c_type_print_args when necessary to put the arguments into the C++
> demangled name. This of course entailed making c_type_print_args non-static.
This i don't really have much problem with.
>
> 3. There was a bug in main.c that meant that the --symbols command line
> argument was effectively ignored in any practical case. I had to fix that
> because we need the --symbols argument for TDS, because the debug
> information may be in a sepearate file to the executable.
>
> 4. Binutils interface change - In the BFD structure I have added a data
> element "opened_for_symbols" - because TDS data may or may not be in the
> same file as an executable, and we need to recognise the executable in one
> case and the debug information in another, I added this member that the
> Borland TDS recognition code checks before deciding if it matches.
Not my call.
>
> 5. Almost everything else should be reasonably kosher as far as
> modifications to existing files go.
>
> I use the following shell script to launch GDB for Borland files - it may
> be useful to people who are going to do this, but I'm not sure if it
> belongs anywhere in the GDB source tree itself.
>
> #!/bin/sh
>
> GNUTARGET=borland-tds
> export GNUTARGET
>
> GDB=/usr/local/bin/gdb
>
> case "x$1" in
> x)
> ;;
>
> *)
> [ -f "$1.tds" ] && {
> exec ${GDB} --symbols="$1.tds" "$@"
> }
> ;;
> esac
> exec ${GDB} "$@"
^ permalink raw reply [flat|nested] 2+ messages in thread