From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Brolley To: Andrew Cagney Cc: gdb-patches@sourceware.cygnus.com, Ben Elliston Subject: Re: [PATCH][RFA]: sim/common: Cpu Frequence and Exec Time Date: Wed, 16 Aug 2000 08:20:00 -0000 Message-id: <399AB171.28A3DA3A@redhat.com> References: <39806B05.96F0DA12@redhat.com> <39934EEE.B60694AC@cygnus.com> X-SW-Source: 2000-08/msg00256.html 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 Subject : Re: [PATCH][RFA]: sim/common: Cpu Frequence and Exec Time >From : Dave Brolley 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 . 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 #endif #endif + #include #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 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 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 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 * 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 * 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 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 * 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 * 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 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 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 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 * 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 * 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 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 > > 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 To: Eli Zaretskii 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 > > > > 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 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 > > 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 To: gdb-patches@sourceware.cygnus.com, Andrew Cagney 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 * 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 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 > > ChangeLog entry: > > 2000-08-17 Pierre Muller > * 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 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 * 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 * 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 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 > > ! \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 To: GDB Patches 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 * 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 * 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 _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 _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 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 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 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 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 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 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 To: Troy Rollo 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: 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} "$@"