From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark Kettenis To: jimb@cygnus.com Cc: gdb@sourceware.cygnus.com, gdb-patches@sourceware.cygnus.com Subject: Linux i387 fix Date: Mon, 13 Dec 1999 14:57:00 -0000 Message-id: <199912132257.XAA10500@delius.kettenis.local> X-SW-Source: 1999-q4/msg00375.html Hi Jim, The current i386-linux.c:supply_fpregset() passes whatever is in the reserved bits on to the GDB register file. Since the coporocessor seems to be initialized in a state where these reserved bits are turned on (at least in non-fpu using threads, see linux/arch/i386/kernel/ptrace.c) this means that `info float' and `info all-registers' will print some funny numbers. At the end of this message you'll find a patch that fixes this. I don't know if supply_xfpregs needs to be fixed too. Depends on the Cygnus-specific Linux kernel patch I guess. Maybe we should make some changes to convert_to_fpregset() too, such that it doesn't change the reserved bits in *FPREGSETP. Right now it overwrites those with the padding that's present in the GDB register file. Mark 1999-12-13 Mark Kettenis * i386-linux-nat.c (supply_fpregset): Mask off the reserved bits in *FPREGSETP before storing the values in the GDB register file. Index: gdb/i386-linux-nat.c =================================================================== RCS file: /var/cvsroot/gdb/gdb/i386-linux-nat.c,v retrieving revision 1.1.1.4 diff -u -r1.1.1.4 i386-linux-nat.c --- gdb/i386-linux-nat.c 1999/12/13 21:10:21 1.1.1.4 +++ gdb/i386-linux-nat.c 1999/12/13 22:44:20 @@ -195,29 +195,36 @@ void supply_fpregset (fpregset_t *fpregsetp) { + long l; int i; /* Supply the floating-point registers. */ for (i = 0; i < 8; i++) supply_register (FP0_REGNUM + i, FPREGSET_T_FPREG_ADDR (fpregsetp, i)); - supply_register (FCTRL_REGNUM, (char *) &fpregsetp->cwd); - supply_register (FSTAT_REGNUM, (char *) &fpregsetp->swd); - supply_register (FTAG_REGNUM, (char *) &fpregsetp->twd); + /* We have to mask off the reserved bits in *FPREGSETP before + storing the values in the GDB register file, since the reserved + parts of the structure typically are initialized with all bits + turned on. */ +#define supply(REGNO, MEMBER) \ + l = fpregsetp->MEMBER & 0xffff; \ + supply_register (REGNO, (char *) &l) + + supply (FCTRL_REGNUM, cwd); + supply (FSTAT_REGNUM, swd); + supply (FTAG_REGNUM, twd); supply_register (FCOFF_REGNUM, (char *) &fpregsetp->fip); - supply_register (FDS_REGNUM, (char *) &fpregsetp->fos); + supply (FDS_REGNUM, fos); supply_register (FDOFF_REGNUM, (char *) &fpregsetp->foo); - - /* Extract the code segment and opcode from the "fcs" member. */ - { - long l; - l = fpregsetp->fcs & 0xffff; - supply_register (FCS_REGNUM, (char *) &l); +#undef supply + + /* Extract the code segment and opcode from the "fcs" member. */ + l = fpregsetp->fcs & 0xffff; + supply_register (FCS_REGNUM, (char *) &l); - l = (fpregsetp->fcs >> 16) & ((1 << 11) - 1); - supply_register (FOP_REGNUM, (char *) &l); - } + l = (fpregsetp->fcs >> 16) & ((1 << 11) - 1); + supply_register (FOP_REGNUM, (char *) &l); } >From ac131313@cygnus.com Mon Dec 13 22:49:00 1999 From: Andrew Cagney To: Stan Shebs Cc: gdb-patches@sourceware.cygnus.com Subject: Re: gdb.h, libgdb.h, gdblib.h, gdb-lib.h, ...? Date: Mon, 13 Dec 1999 22:49:00 -0000 Message-id: <3855E84A.FB73EFA6@cygnus.com> References: <199912132229.OAA16265@andros.cygnus.com> X-SW-Source: 1999-q4/msg00376.html Content-length: 2370 Stan Shebs wrote: > > Date: Mon, 13 Dec 1999 11:35:31 +1100 > From: Andrew Cagney > > So, ok I've been ignoring this one. > > We're going to try to create a library. Some bits, like ``struct > gdb_file'' can easily live in ``gdb-file.h'' where they can be (fairly > safely) included by non-core GDB code. > > But what of the main GDB functions? Eg: > > XXX {lib,}gdb{,lib}_breakpoint_query (..., b, ...); > > For the moment, based on a detailed probabilistic analysis (coin toss) > I'll assume ``gdb.h''. If anyone can think of a compelling case for > some other name, please speak now :-) > > I'd vote for libgdb.h, since a) it's the term we've been using for the > past seven years, and b) it's useful to emphasize that this is a > library interface, not something that is purely internal to GDB. For > instance, if you look at X11, X clients normally include Xlib.h. > Xlib.h then includes X.h, which is the lower-level stuff that's (at > least partly) common to both clients and servers. > > I'd also like us just to have a single .h file that includes > everything that a libgdb client would need. It's going to be very > hard for someone to use just part of libgdb, because of all the > internal interconnections. If GDB ever gets decoupled internally, > and anybody cares, they can split libgdb.h too - until then we'd > just be deceiving ourselves. While initially there will be only one file ``libgdb.h'' I think we still need to make it our clear objective that the interface presented be clearly decoupled from the internals and, consequently modularized. Even if the internal spaghetti is never eliminated that tangle should not be reflected in the interface :-). BTW, off the top of my head, I can already see the separate components: libgdb.h: basic types for gdb including *$(*@ CORE_ADDR bit like defs.h was like before it lost the plot :-) libgdb-varobj.h: A cleanup/rewrite of GDBtk's variable object code. Only code wanting to manage variable objects would need to pull that in. libgdb-eventloop.h: GDB's event-loop requirements/interface. Only the clients ``xxx-top.c'' would need to worry about that. Any way, next question. In a futile attempt to avoid name space pollution, are all external names prefixed with ``gdb_'' or ``libgdb_''? Andrew >From ac131313@cygnus.com Tue Dec 14 00:38:00 1999 From: Andrew Cagney To: GDB Patches Subject: [breakpoint.c] Does ``break overloaded if x'' leak memory? Date: Tue, 14 Dec 1999 00:38:00 -0000 Message-id: <385601E8.FB7BDE66@cygnus.com> X-SW-Source: 1999-q4/msg00377.html Content-length: 5418 Hello, Now that I understand how breapoint.c:break_command_1() can end up with several breakpoints :-) I'm wondering if the code that parses the ``if'' condition leaks memory: /* Resolve all line numbers to PC's, and verify that conditions can be parsed, before setting any breakpoints. */ for (i = 0; i < sals.nelts; i++) { char *tok, *end_tok; int toklen; resolve_sal_pc (&sals.sals[i]); [...] tok = arg; while (tok && *tok) { while (*tok == ' ' || *tok == '\t') tok++; end_tok = tok; while (*end_tok != ' ' && *end_tok != '\t' && *end_tok != '\000') end_tok++; toklen = end_tok - tok; if (toklen >= 1 && strncmp (tok, "if", toklen) == 0) { tok = cond_start = end_tok + 1; cond = parse_exp_1 (&tok, block_for_pc (sals.sals[i].pc), 0); cond_end = tok; } [...] As far as I can tell the if statement is re-parsed each time round this loop but, unfortunatly, each time, the old result is thrown away :-(. At the end the code ends up with just one expression and that is stored in all the created breakpoints. Andrew PS: Why? I'm looking to split break_command_1() into the part that creates the breakpoint and the part that does the parsing. PPS: I strongly suspect this is correct :-) (gdb) break foo::overload1arg if 1 [0] cancel [1] all [2] foo::overload1arg(double) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:121 [3] foo::overload1arg(float) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:120 [4] foo::overload1arg(unsigned long) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:119 [5] foo::overload1arg(long) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:118 [6] foo::overload1arg(unsigned int) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:117 [7] foo::overload1arg(int) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:116 [8] foo::overload1arg(unsigned short) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:115 [9] foo::overload1arg(short) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:114 [10] foo::overload1arg(unsigned char) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:113 [11] foo::overload1arg(signed char) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:112 [12] foo::overload1arg(char) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:111 [13] foo::overload1arg(void) at /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc:110 > 1 Note: breakpoint 14 also set at pc 0x4d6. Breakpoint 26 at 0x4d6: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 121. Note: breakpoint 15 also set at pc 0x4c1. Breakpoint 27 at 0x4c1: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 120. Note: breakpoint 16 also set at pc 0x4ac. Breakpoint 28 at 0x4ac: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 119. Note: breakpoint 17 also set at pc 0x497. Breakpoint 29 at 0x497: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 118. Note: breakpoint 18 also set at pc 0x482. Breakpoint 30 at 0x482: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 117. Note: breakpoint 19 also set at pc 0x46d. Breakpoint 31 at 0x46d: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 116. Note: breakpoint 20 also set at pc 0x458. Breakpoint 32 at 0x458: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 115. Note: breakpoint 21 also set at pc 0x43f. Breakpoint 33 at 0x43f: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 114. Note: breakpoint 22 also set at pc 0x426. Breakpoint 34 at 0x426: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 113. Note: breakpoint 23 also set at pc 0x40d. Breakpoint 35 at 0x40d: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 112. Note: breakpoint 24 also set at pc 0x3f4. Breakpoint 36 at 0x3f4: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 111. Note: breakpoint 25 also set at pc 0x3df. Breakpoint 37 at 0x3df: file /home/scratch/wip-gdb-breakpoint-B-devo/devo/gdb/testsuite/gdb.c++/ovldbreak.cc, line 110. warning: Multiple breakpoints were set. warning: Use the "delete" command to delete unwanted breakpoints. (gdb) delete Delete all breakpoints? (y or n) y gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. gdb in free(): warning: chunk is already free. (gdb) >From ac131313@cygnus.com Tue Dec 14 05:04:00 1999 From: Andrew Cagney To: GDB Patches Subject: Re: [breakpoint.c] Does ``break overloaded if x'' leak memory? Date: Tue, 14 Dec 1999 05:04:00 -0000 Message-id: <3856403B.4F8CE484@cygnus.com> References: <385601E8.FB7BDE66@cygnus.com> X-SW-Source: 1999-q4/msg00378.html Content-length: 9023 Andrew Cagney wrote: > > Hello, > > Now that I understand how breapoint.c:break_command_1() can end up with > several breakpoints :-) I'm wondering if the code that parses the ``if'' > condition leaks memory: > > [....] > > As far as I can tell the if statement is re-parsed each time round this > loop but, unfortunatly, each time, the old result is thrown away :-(. > At the end the code ends up with just one expression and that is stored > in all the created breakpoints. > > Andrew > I've attatched a patch that fixes this problem. It goes through and ensures that each breakpoint has an individual copy of everything (and simplifying things a tiny bit I think :-). Andrew Tue Dec 14 23:47:15 1999 Andrew Cagney * breakpoint.c (break_command_1): Pre-allocate each breakpoints addr_string. Allocate a separate cond and cond_string for each breakpoint. Index: breakpoint.c =================================================================== RCS file: /cvs/cvsfiles/devo/gdb/breakpoint.c,v retrieving revision 1.278 diff -p -r1.278 breakpoint.c *** breakpoint.c 1999/12/13 21:27:12 1.278 --- breakpoint.c 1999/12/14 12:58:43 *************** break_command_1 (arg, flag, from_tty) *** 4729,4749 **** int tempflag, hardwareflag; struct symtabs_and_lines sals; struct symtab_and_line sal; ! register struct expression *cond = 0; register struct breakpoint *b; ! ! /* Pointers in arg to the start, and one past the end, of the condition. */ char *cond_start = NULL; char *cond_end = NULL; ! /* Pointers in arg to the start, and one past the end, ! of the address part. */ char *addr_start = NULL; char *addr_end = NULL; struct cleanup *old_chain; ! struct cleanup *canonical_strings_chain = NULL; ! char **canonical = (char **) NULL; int i; ! int thread; hardwareflag = flag & BP_HARDWAREFLAG; tempflag = flag & BP_TEMPFLAG; --- 4748,4770 ---- int tempflag, hardwareflag; struct symtabs_and_lines sals; struct symtab_and_line sal; ! register struct expression **cond = 0; register struct breakpoint *b; ! /* Pointers in arg to the start, and one past the end, of the ! condition. */ char *cond_start = NULL; char *cond_end = NULL; ! char **cond_string = (char **) NULL; ! /* Pointers in arg to the start, and one past the end, of the ! address part. */ char *addr_start = NULL; char *addr_end = NULL; + char **addr_string = (char **) NULL; struct cleanup *old_chain; ! struct cleanup *breakpoint_chain = NULL; int i; ! int thread = -1; ! int ignore_count = 0; hardwareflag = flag & BP_HARDWAREFLAG; tempflag = flag & BP_TEMPFLAG; *************** break_command_1 (arg, flag, from_tty) *** 4753,4759 **** INIT_SAL (&sal); /* initialize to zeroes */ ! /* If no arg given, or if first arg is 'if ', use the default breakpoint. */ if (!arg || (arg[0] == 'i' && arg[1] == 'f' && (arg[2] == ' ' || arg[2] == '\t'))) --- 4774,4781 ---- INIT_SAL (&sal); /* initialize to zeroes */ ! /* If no arg given, or if first arg is 'if ', use the default ! breakpoint. */ if (!arg || (arg[0] == 'i' && arg[1] == 'f' && (arg[2] == ' ' || arg[2] == '\t'))) *************** break_command_1 (arg, flag, from_tty) *** 4784,4792 **** && (!current_source_symtab || (arg && (*arg == '+' || *arg == '-')))) sals = decode_line_1 (&arg, 1, default_breakpoint_symtab, ! default_breakpoint_line, &canonical); else ! sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, 0, &canonical); addr_end = arg; } --- 4806,4814 ---- && (!current_source_symtab || (arg && (*arg == '+' || *arg == '-')))) sals = decode_line_1 (&arg, 1, default_breakpoint_symtab, ! default_breakpoint_line, &addr_string); else ! sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, 0, &addr_string); addr_end = arg; } *************** break_command_1 (arg, flag, from_tty) *** 4794,4811 **** if (!sals.nelts) return; ! /* Make sure that all storage allocated in decode_line_1 gets freed ! in case the following `for' loop errors out. */ ! old_chain = make_cleanup (free, sals.sals); ! if (canonical != (char **) NULL) ! { ! make_cleanup (free, canonical); ! canonical_strings_chain = make_cleanup (null_cleanup, 0); ! for (i = 0; i < sals.nelts; i++) ! { ! if (canonical[i] != NULL) ! make_cleanup (free, canonical[i]); ! } } thread = -1; /* No specific thread yet */ --- 4816,4856 ---- if (!sals.nelts) return; ! /* Create a chain of things at always need to be cleaned up. */ ! old_chain = make_cleanup (null_cleanup, 0); ! ! /* Make sure that all storage allocated to SALS gets freed. */ ! make_cleanup (free, sals.sals); ! ! /* Allocate space for all the cond expressions. */ ! cond = xcalloc (sals.nelts, sizeof (struct expression *)); ! make_cleanup (free, cond); ! ! /* Allocate space for all the cond strings. */ ! cond_string = xcalloc (sals.nelts, sizeof (char **)); ! make_cleanup (free, cond_string); ! ! /* Always have a addr_string array, even if it is empty. */ ! if (addr_string == NULL) ! addr_string = xcalloc (sals.nelts, sizeof (char **)); ! make_cleanup (free, addr_string); ! ! /* ----------------------------- SNIP ----------------------------- ! Anything added to the cleanup chain beyond this point is assumed ! to be part of a breakpoint. If the breakpoint create goes ! through then that memory is not cleaned up. */ ! breakpoint_chain = make_cleanup (null_cleanup, 0); ! ! /* Go through the addr_string SAL's and fill in the gaps with the ! addr_start/end string found above. */ ! for (i = 0; i < sals.nelts; i++) ! { ! /* Add the string if not present. */ ! if (addr_string[i] == NULL && addr_start != NULL) ! addr_string[i] = savestring (addr_start, addr_end - addr_start); ! /* Mark this as recoverable. */ ! if (addr_string[i] != NULL) ! make_cleanup (free, addr_string[i]); } thread = -1; /* No specific thread yet */ *************** break_command_1 (arg, flag, from_tty) *** 4855,4862 **** if (toklen >= 1 && strncmp (tok, "if", toklen) == 0) { tok = cond_start = end_tok + 1; ! cond = parse_exp_1 (&tok, block_for_pc (sals.sals[i].pc), 0); cond_end = tok; } else if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0) { --- 4900,4910 ---- if (toklen >= 1 && strncmp (tok, "if", toklen) == 0) { tok = cond_start = end_tok + 1; ! cond[i] = parse_exp_1 (&tok, block_for_pc (sals.sals[i].pc), 0); ! make_cleanup (free, cond[i]); cond_end = tok; + cond_string[i] = savestring (cond_start, cond_end - cond_start); + make_cleanup (free, cond_string[i]); } else if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0) { *************** break_command_1 (arg, flag, from_tty) *** 4888,4896 **** error ("Hardware breakpoints used exceeds limit."); } ! /* Remove the canonical strings from the cleanup, they are needed below. */ ! if (canonical != (char **) NULL) ! discard_cleanups (canonical_strings_chain); /* Now set all the breakpoints. */ for (i = 0; i < sals.nelts; i++) --- 4936,4944 ---- error ("Hardware breakpoints used exceeds limit."); } ! /* This is it: Discard all the cleanups for data inserted into the ! breakpoint. */ ! discard_cleanups (breakpoint_chain); /* Now set all the breakpoints. */ for (i = 0; i < sals.nelts; i++) *************** break_command_1 (arg, flag, from_tty) *** 4904,4921 **** set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; b->type = hardwareflag ? bp_hardware_breakpoint : bp_breakpoint; ! b->cond = cond; b->thread = thread; ! ! /* If a canonical line spec is needed use that instead of the ! command string. */ ! if (canonical != (char **) NULL && canonical[i] != NULL) ! b->addr_string = canonical[i]; ! else if (addr_start) ! b->addr_string = savestring (addr_start, addr_end - addr_start); ! if (cond_start) ! b->cond_string = savestring (cond_start, cond_end - cond_start); ! b->enable = enabled; b->disposition = tempflag ? del : donttouch; mention (b); --- 4952,4962 ---- set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; b->type = hardwareflag ? bp_hardware_breakpoint : bp_breakpoint; ! b->cond = cond[i]; b->thread = thread; ! b->addr_string = addr_string[i]; ! b->cond_string = cond_string[i]; ! b->ignore_count = ignore_count; b->enable = enabled; b->disposition = tempflag ? del : donttouch; mention (b); >From msnyder@cygnus.com Tue Dec 14 13:07:00 1999 From: Michael Snyder To: gdb-patches@sourceware.cygnus.com Cc: cagney@cygnus.com Subject: moving target_pid_to_str into the target vector. Date: Tue, 14 Dec 1999 13:07:00 -0000 Message-id: <3856B173.3740@cygnus.com> X-SW-Source: 1999-q4/msg00379.html Content-length: 570 This is a heads-up: I plan to change the macro "target_pid_to_str" into a target vector method, allowing the same sort of inheritance and overriding as the other target vector methods. This will be of especial use to architectures that may have more than one possible representation of threads (such as solaris, maybe hpux). Native target files that I will touch in making this change include the following (if I've left any out, please let me know): inftarg.c gnu-nat.c hppah-nat.c and infttrace.c sol-thread.c procfs.c linux-thread.c win32-nat.c lynx-nat.c >From ac131313@cygnus.com Tue Dec 14 21:17:00 1999 From: Andrew Cagney To: GDB Patches Subject: Is ``break main if(1)'' legal? Date: Tue, 14 Dec 1999 21:17:00 -0000 Message-id: <38572456.8C003027@cygnus.com> X-SW-Source: 1999-q4/msg00380.html Content-length: 138 (vs ``break main if (1)'') Some parts of the code (decode_line_1()) think it is legal but other parts (break_command_1()) don't. Andrew >From law@cygnus.com Wed Dec 15 00:59:00 1999 From: Jeffrey A Law To: Andrew Cagney Cc: Jimmy Guo , gdb-patches@sourceware.cygnus.com Subject: Re: (patch) hpjyg15: hppah-nat.c & related Date: Wed, 15 Dec 1999 00:59:00 -0000 Message-id: <881.945247412@upchuck> References: <382B585D.421E98F3@cygnus.com> X-SW-Source: 1999-q4/msg00381.html Content-length: 1119 In message < 382B585D.421E98F3@cygnus.com >you write: > Jimmy Guo wrote: > > > > This patch updates hppah-nat.c and related files target.[ch] and > > infrun.c. See ChangeLog below. > > Jim, > > Don't forget that the GDB's coding style is defined by the output of > indent. Looking more closely I noticed that some of the changes are to > ``fix'' the indentation. Please just grit your teath and ignore it. > > It's a good idea to carefully review the diffs and revert/remove any > changes not specific to the problem at hand. > > Doing this makes the reviewers life so much easier. Agreed. What I would recommend is to send pure formatting changes to unrelated code as a separate change. That makes it *much* easier for the review to separate the formatting fixes from patches that require one to think about the consequences of a change. Additionally, raw formatting patches can go almost immediately since by definition they do not change the behavior of GDB. This is a special case of the general rule that independent changes should be sent as independent patches. jeff