Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@redhat.com>
To: Daniel Berlin <dberlin@redhat.com>
Cc: Michael Eager <eager@eagercon.com>, Stan Shebs <shebs@apple.com>,
	gdb-patches@sources.redhat.com
Subject: Re: Forgot to note
Date: Wed, 11 Oct 2000 13:00:00 -0000	[thread overview]
Message-ID: <39E4C6F3.5A2F@redhat.com> (raw)
In-Reply-To: <m3y9zv6tku.fsf@dan2.cygnus.com>

Daniel Berlin wrote:
> 
> Michael Eager <eager@eagercon.com> writes:
> 
> > Stan Shebs wrote:
> > >
> > > Even under an optimistic dwarf2 adoption scenario (dwarf2 still
> > > hasn't been standardized for one thing, although it's getting
> > > close), the stabs format is going to be with us for at least another
> > > five years, so you should plan your hacking so that you can live with
> > > the stabs reader for that long.
> >
> > FYI, the current plan is to consider all of the proposals for
> > changes to Dwarf 2 by the end of this year and release a version
> > of the revised standard for public review early in 2001.
> >
> > My experience is the same as Stan's.  Old formats don't disappear,
> > and they certainly don't disappear because someone says that they
> > should.  Plan for a long End-Of-Life status.
> 
> Then, as i said, i'm really going to need some help doing this.

Hey, we all know the feeling.  ;-)
From eliz@delorie.com Thu Oct 12 00:54:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: dberlin@redhat.com
Cc: dj@delorie.com, meissner@cygnus.com, gdb-patches@sources.redhat.com
Subject: Re: Forgot to note
Date: Thu, 12 Oct 2000 00:54:00 -0000
Message-id: <200010120754.DAA07133@indy.delorie.com>
References: <m33di46wkl.fsf@dan2.cygnus.com> <20001010211904.49719@cse.cygnus.com> <m3bswsds9s.fsf@dan2.cygnus.com> <200010111652.MAA12141@envy.delorie.com> <m37l7f88cl.fsf@dan2.cygnus.com>
X-SW-Source: 2000-10/msg00074.html
Content-length: 678

> > > It's arguably a *lot* simpler to change those platforms to dwarf2,
> > > then to support new-abi/stabs *and* old-abi/stabs at the same time.
> > 
> > OK, I'll let you change DJGPP's built-in crash analyzer program, which
> > only understands stabs, and the mini-debuggers (edebug32, fsdb) and
> > IDE (rhide), which also only understand stabs.  No, they don't use
> > BFD. 
> 
> Do they have the cruft necessary to properly debug C++ stabs programs?

Yes.

> Does C++ debugging with GDB work on djgpp

Yes.

> (I've never seen test results for the C++ tests)?

The GDB test suite doesn't work for DJGPP, for reasons that have
nothing to do with GDB or C++ support per se.
From taylor@cygnus.com Thu Oct 12 07:07:00 2000
From: David Taylor <taylor@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [RFA] addresses/pointers vs numbers and expression evaluation
Date: Thu, 12 Oct 2000 07:07:00 -0000
Message-id: <200010121406.KAA21106@texas.cygnus.com>
X-SW-Source: 2000-10/msg00075.html
Content-length: 12482

The following patch concerns bugs brought to light during a port of
gdb to a target with separate instruction and data.

The bugs will potentially impact any port which defines
POINTER_TO_ADDRESS to have any value other than the default value.

There are undoubtably additional bugs still lurking in the expression
evaluation code.

Several places in gdb it calls

    parse_and_eval_address

when the expression is *NOT* an address, but rather is just a number!
For example, it calls parse_and_eval_address when you type:

    set height 24

For this processor, treating 24 as a pointer resulted in an address of
0x01000018 -- 16 meg plus 24!  Similarly, it does this for the count
given to the continue and step commands as well as a few other places.

To fix this, I have create a new function called parse_and_eval_long
and changed 17 of the calls to parse_and_eval_address.

I have tested this on solaris native and on solaris x d10v (using the
simulator).  There were no regressions.

Here's the ChangeLog entry and the patch:

	* parse.c (parse_and_eval_long): New function.
	(value.h): Declare it.
	
	* breakpoint.c (breakpoints_info, maintenance_info_breakpoints):
	Call parse_and_eval_long, not parse_and_eval_address.
	* command.c (do_setshow_command): Ditto.
	* infcmd.c (step_1, signal_command, continue_command): Ditto.
	* infrun.c (signals_info): Ditto.
	* stack.c (set_backtrace_limit_command, backtrace_command_1,
	up_silently_base, down_silently_base): Ditto.
	* tracepoints.c (tracepoints_info, trace_find_command,
 	trace_find_tracepoint_command): Ditto.
	* valprint.c (set_radix): Ditto.
	* values (show_values): Ditto.
	
Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.17
diff -c -r1.17 breakpoint.c
*** breakpoint.c	2000/08/30 00:58:58	1.17
--- breakpoint.c	2000/10/12 13:57:06
***************
*** 3638,3644 ****
    int bnum = -1;
  
    if (bnum_exp)
!     bnum = parse_and_eval_address (bnum_exp);
  
    breakpoint_1 (bnum, 0);
  }
--- 3638,3644 ----
    int bnum = -1;
  
    if (bnum_exp)
!     bnum = parse_and_eval_long (bnum_exp);
  
    breakpoint_1 (bnum, 0);
  }
***************
*** 3650,3656 ****
    int bnum = -1;
  
    if (bnum_exp)
!     bnum = parse_and_eval_address (bnum_exp);
  
    breakpoint_1 (bnum, 1);
  }
--- 3650,3656 ----
    int bnum = -1;
  
    if (bnum_exp)
!     bnum = parse_and_eval_long (bnum_exp);
  
    breakpoint_1 (bnum, 1);
  }
Index: command.c
===================================================================
RCS file: /cvs/src/src/gdb/command.c,v
retrieving revision 1.17
diff -c -r1.17 command.c
*** command.c	2000/08/08 00:17:39	1.17
--- command.c	2000/10/12 13:57:08
***************
*** 1622,1628 ****
  	case var_uinteger:
  	  if (arg == NULL)
  	    error_no_arg ("integer to set it to.");
! 	  *(unsigned int *) c->var = parse_and_eval_address (arg);
  	  if (*(unsigned int *) c->var == 0)
  	    *(unsigned int *) c->var = UINT_MAX;
  	  break;
--- 1622,1628 ----
  	case var_uinteger:
  	  if (arg == NULL)
  	    error_no_arg ("integer to set it to.");
! 	  *(unsigned int *) c->var = parse_and_eval_long (arg);
  	  if (*(unsigned int *) c->var == 0)
  	    *(unsigned int *) c->var = UINT_MAX;
  	  break;
***************
*** 1631,1637 ****
  	    unsigned int val;
  	    if (arg == NULL)
  	      error_no_arg ("integer to set it to.");
! 	    val = parse_and_eval_address (arg);
  	    if (val == 0)
  	      *(int *) c->var = INT_MAX;
  	    else if (val >= INT_MAX)
--- 1631,1637 ----
  	    unsigned int val;
  	    if (arg == NULL)
  	      error_no_arg ("integer to set it to.");
! 	    val = parse_and_eval_long (arg);
  	    if (val == 0)
  	      *(int *) c->var = INT_MAX;
  	    else if (val >= INT_MAX)
***************
*** 1643,1649 ****
  	case var_zinteger:
  	  if (arg == NULL)
  	    error_no_arg ("integer to set it to.");
! 	  *(int *) c->var = parse_and_eval_address (arg);
  	  break;
  	case var_enum:
  	  {
--- 1643,1649 ----
  	case var_zinteger:
  	  if (arg == NULL)
  	    error_no_arg ("integer to set it to.");
! 	  *(int *) c->var = parse_and_eval_long (arg);
  	  break;
  	case var_enum:
  	  {
Index: eval.c
===================================================================
RCS file: /cvs/src/src/gdb/eval.c,v
retrieving revision 1.8
diff -c -r1.8 eval.c
*** eval.c	2000/09/01 23:50:17	1.8
--- eval.c	2000/10/12 13:57:09
***************
*** 103,108 ****
--- 103,123 ----
    return addr;
  }
  
+ /* Like parse_and_eval_address, but treats the value of the expression
+    as an integer, not an address, returns a LONGEST, not a CORE_ADDR */
+ LONGEST
+ parse_and_eval_long (char *exp)
+ {
+   struct expression *expr = parse_expression (exp);
+   register LONGEST retval;
+   register struct cleanup *old_chain =
+     make_cleanup (free_current_contents, &expr);
+ 
+   retval = value_as_long (evaluate_expression (expr));
+   do_cleanups (old_chain);
+   return (retval);
+ }
+ 
  value_ptr
  parse_and_eval (char *exp)
  {
Index: infcmd.c
===================================================================
RCS file: /cvs/src/src/gdb/infcmd.c,v
retrieving revision 1.11
diff -c -r1.11 infcmd.c
*** infcmd.c	2000/09/02 00:07:13	1.11
--- infcmd.c	2000/10/12 13:57:11
***************
*** 381,387 ****
        while (num != 0)
  	{
  	  set_ignore_count (num,
! 			    parse_and_eval_address (proc_count_exp) - 1,
  			    from_tty);
  	  /* set_ignore_count prints a message ending with a period.
  	     So print two spaces before "Continuing.".  */
--- 381,387 ----
        while (num != 0)
  	{
  	  set_ignore_count (num,
! 			    parse_and_eval_long (proc_count_exp) - 1,
  			    from_tty);
  	  /* set_ignore_count prints a message ending with a period.
  	     So print two spaces before "Continuing.".  */
***************
*** 465,471 ****
        async_disable_stdin ();
      }
  
!   count = count_string ? parse_and_eval_address (count_string) : 1;
  
    if (!single_inst || skip_subroutines)		/* leave si command alone */
      {
--- 465,471 ----
        async_disable_stdin ();
      }
  
!   count = count_string ? parse_and_eval_long (count_string) : 1;
  
    if (!single_inst || skip_subroutines)		/* leave si command alone */
      {
***************
*** 777,783 ****
    if (oursig == TARGET_SIGNAL_UNKNOWN)
      {
        /* No, try numeric.  */
!       int num = parse_and_eval_address (signum_exp);
  
        if (num == 0)
  	oursig = TARGET_SIGNAL_0;
--- 777,783 ----
    if (oursig == TARGET_SIGNAL_UNKNOWN)
      {
        /* No, try numeric.  */
!       int num = parse_and_eval_long (signum_exp);
  
        if (num == 0)
  	oursig = TARGET_SIGNAL_0;
Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.18
diff -c -r1.18 infrun.c
*** infrun.c	2000/09/02 00:08:05	1.18
--- infrun.c	2000/10/12 13:57:15
***************
*** 3899,3905 ****
  	{
  	  /* No, try numeric.  */
  	  oursig =
! 	    target_signal_from_command (parse_and_eval_address (signum_exp));
  	}
        sig_print_info (oursig);
        return;
--- 3899,3905 ----
  	{
  	  /* No, try numeric.  */
  	  oursig =
! 	    target_signal_from_command (parse_and_eval_long (signum_exp));
  	}
        sig_print_info (oursig);
        return;
Index: stack.c
===================================================================
RCS file: /cvs/src/src/gdb/stack.c,v
retrieving revision 1.7
diff -c -r1.7 stack.c
*** stack.c	2000/07/30 01:48:27	1.7
--- stack.c	2000/10/12 13:57:17
***************
*** 1038,1044 ****
  static void
  set_backtrace_limit_command (char *count_exp, int from_tty)
  {
!   int count = parse_and_eval_address (count_exp);
  
    if (count < 0)
      error ("Negative argument not meaningful as backtrace limit.");
--- 1038,1044 ----
  static void
  set_backtrace_limit_command (char *count_exp, int from_tty)
  {
!   int count = parse_and_eval_long (count_exp);
  
    if (count < 0)
      error ("Negative argument not meaningful as backtrace limit.");
***************
*** 1086,1092 ****
    trailing_level = 0;
    if (count_exp)
      {
!       count = parse_and_eval_address (count_exp);
        if (count < 0)
  	{
  	  struct frame_info *current;
--- 1086,1092 ----
    trailing_level = 0;
    if (count_exp)
      {
!       count = parse_and_eval_long (count_exp);
        if (count < 0)
  	{
  	  struct frame_info *current;
***************
*** 1740,1746 ****
    register struct frame_info *fi;
    int count = 1, count1;
    if (count_exp)
!     count = parse_and_eval_address (count_exp);
    count1 = count;
  
    if (target_has_stack == 0 || selected_frame == 0)
--- 1740,1746 ----
    register struct frame_info *fi;
    int count = 1, count1;
    if (count_exp)
!     count = parse_and_eval_long (count_exp);
    count1 = count;
  
    if (target_has_stack == 0 || selected_frame == 0)
***************
*** 1777,1783 ****
    register struct frame_info *frame;
    int count = -1, count1;
    if (count_exp)
!     count = -parse_and_eval_address (count_exp);
    count1 = count;
  
    if (target_has_stack == 0 || selected_frame == 0)
--- 1777,1783 ----
    register struct frame_info *frame;
    int count = -1, count1;
    if (count_exp)
!     count = -parse_and_eval_long (count_exp);
    count1 = count;
  
    if (target_has_stack == 0 || selected_frame == 0)
Index: tracepoint.c
===================================================================
RCS file: /cvs/src/src/gdb/tracepoint.c,v
retrieving revision 1.10
diff -c -r1.10 tracepoint.c
*** tracepoint.c	2000/09/01 00:12:10	1.10
--- tracepoint.c	2000/10/12 13:57:19
***************
*** 465,471 ****
    int tpnum = -1;
  
    if (tpnum_exp)
!     tpnum = parse_and_eval_address (tpnum_exp);
  
    ALL_TRACEPOINTS (t)
      if (tpnum == -1 || tpnum == t->number)
--- 465,471 ----
    int tpnum = -1;
  
    if (tpnum_exp)
!     tpnum = parse_and_eval_long (tpnum_exp);
  
    ALL_TRACEPOINTS (t)
      if (tpnum == -1 || tpnum == t->number)
***************
*** 1986,1992 ****
  	  frameno = traceframe_number - 1;
  	}
        else
! 	frameno = parse_and_eval_address (args);
  
        if (frameno < -1)
  	error ("invalid input (%d is less than zero)", frameno);
--- 1986,1992 ----
  	  frameno = traceframe_number - 1;
  	}
        else
! 	frameno = parse_and_eval_long (args);
  
        if (frameno < -1)
  	error ("invalid input (%d is less than zero)", frameno);
Index: valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/valprint.c,v
retrieving revision 1.6
diff -c -r1.6 valprint.c
*** valprint.c	2000/07/30 01:48:27	1.6
--- valprint.c	2000/10/12 13:57:20
***************
*** 1416,1422 ****
  {
    unsigned radix;
  
!   radix = (arg == NULL) ? 10 : parse_and_eval_address (arg);
    set_output_radix_1 (0, radix);
    set_input_radix_1 (0, radix);
    if (from_tty)
--- 1416,1422 ----
  {
    unsigned radix;
  
!   radix = (arg == NULL) ? 10 : parse_and_eval_long (arg);
    set_output_radix_1 (0, radix);
    set_input_radix_1 (0, radix);
    if (from_tty)
Index: value.h
===================================================================
RCS file: /cvs/src/src/gdb/value.h,v
retrieving revision 1.10
diff -c -r1.10 value.h
*** value.h	2000/09/04 08:29:25	1.10
--- value.h	2000/10/12 13:57:21
***************
*** 410,415 ****
--- 410,417 ----
  
  extern CORE_ADDR parse_and_eval_address_1 (char **expptr);
  
+ extern LONGEST parse_and_eval_long (char *exp);
+ 
  extern value_ptr access_value_history (int num);
  
  extern value_ptr value_of_internalvar (struct internalvar *var);
Index: values.c
===================================================================
RCS file: /cvs/src/src/gdb/values.c,v
retrieving revision 1.9
diff -c -r1.9 values.c
*** values.c	2000/07/30 01:48:27	1.9
--- values.c	2000/10/12 13:57:22
***************
*** 351,357 ****
        /* "info history +" should print from the stored position.
           "info history <exp>" should print around value number <exp>.  */
        if (num_exp[0] != '+' || num_exp[1] != '\0')
! 	num = parse_and_eval_address (num_exp) - 5;
      }
    else
      {
--- 351,357 ----
        /* "info history +" should print from the stored position.
           "info history <exp>" should print around value number <exp>.  */
        if (num_exp[0] != '+' || num_exp[1] != '\0')
! 	num = parse_and_eval_long (num_exp) - 5;
      }
    else
      {
From ezannoni@cygnus.com Thu Oct 12 09:53:00 2000
From: Elena Zannoni <ezannoni@cygnus.com>
To: Daniel Berlin <dberlin@redhat.com>
Cc: gdb-patches@sources.redhat.com, Elena Zannoni <ezannoni@cygnus.com>
Subject: Re: [RFA]: Remove linear search for C++
Date: Thu, 12 Oct 2000 09:53:00 -0000
Message-id: <14821.60528.681193.751884@kwikemart.cygnus.com>
References: <m3g0m4dnv1.fsf@dan2.cygnus.com>
X-SW-Source: 2000-10/msg00076.html
Content-length: 15780

OK, I committed the following:


2000-10-12  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>

	From Daniel Berlin <dberlin@redhat.com> :

	* symtab.c (lookup_symbol_aux): New function. Renamed from
 	lookup_symbol. Move code to do demangling/case sensitivity to
 	lookup_symbol().
  	(lookup_symbol): Now wrapper for lookup_symbol_aux, so we can
 	perform case sensitivity/demangling without leaking memory.  Move
 	code to do demangling/case sensitivity from old_lookup_symbol to
 	here.
	(lookup_partial_symbol): Use SYMBOL_SOURCE_NAME instead of
 	SYMBOL_NAME.
	(lookup_block_symbol): Use SYMBOL_SOURCE_NAME instead of
 	SYMBOL_NAME. Don't do linear search in case of C++.

  	* symfile.c (compare_symbols): Use SYMBOL_SOURCE_NAME instead of
 	SYMBOL_NAME.
  	(compare_psymbols): Same here.

Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.18
diff -c -u -p -r1.18 symfile.c
--- symfile.c	2000/09/02 00:09:06	1.18
+++ symfile.c	2000/10/12 16:37:15
@@ -212,8 +212,7 @@ compare_symbols (const PTR s1p, const PT
 
   s1 = (struct symbol **) s1p;
   s2 = (struct symbol **) s2p;
-
-  return (STRCMP (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2)));
+  return (STRCMP (SYMBOL_SOURCE_NAME (*s1), SYMBOL_SOURCE_NAME (*s2)));
 }
 
 /*
@@ -241,8 +240,14 @@ compare_symbols (const PTR s1p, const PT
 static int
 compare_psymbols (const PTR s1p, const PTR s2p)
 {
-  register char *st1 = SYMBOL_NAME (*(struct partial_symbol **) s1p);
-  register char *st2 = SYMBOL_NAME (*(struct partial_symbol **) s2p);
+  register struct partial_symbol **s1, **s2;
+  register char *st1, *st2;
+
+  s1 = (struct partial_symbol **) s1p;
+  s2 = (struct partial_symbol **) s2p;
+  st1 = SYMBOL_SOURCE_NAME (*s1);
+  st2 = SYMBOL_SOURCE_NAME (*s2);
+
 
   if ((st1[0] - st2[0]) || !st1[0])
     {
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.15
diff -c -u -p -r1.15 symtab.c
--- symtab.c	2000/09/04 08:29:25	1.15
+++ symtab.c	2000/10/12 16:37:16
@@ -83,6 +83,13 @@ static struct partial_symbol *lookup_par
 
 static struct symtab *lookup_symtab_1 (char *);
 
+static struct symbol *lookup_symbol_aux (const char *name, const
+					 struct block *block, const
+					 namespace_enum namespace, int
+					 *is_a_field_of_this, struct
+					 symtab **symtab);
+
+
 static void cplusplus_hint (char *);
 
 static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
@@ -572,17 +579,14 @@ fixup_psymbol_section (struct partial_sy
    can probably assume it will never hit the C++ code).  */
 
 struct symbol *
-lookup_symbol (const char *name, register const struct block *block,
+lookup_symbol (const char *name, const struct block *block,
 	       const namespace_enum namespace, int *is_a_field_of_this,
 	       struct symtab **symtab)
 {
-  register struct symbol *sym;
-  register struct symtab *s = NULL;
-  register struct partial_symtab *ps;
-  struct blockvector *bv;
-  register struct objfile *objfile = NULL;
-  register struct block *b;
-  register struct minimal_symbol *msymbol;
+  char *modified_name = NULL;
+  char *modified_name2 = NULL;
+  int needtofreename = 0;
+  struct symbol *returnval;
 
   if (case_sensitivity == case_sensitive_off)
     {
@@ -594,9 +598,45 @@ lookup_symbol (const char *name, registe
       for (i= 0; i < len; i++)
         copy[i] = tolower (name[i]);
       copy[len] = 0;
-      name = copy;
+      modified_name = copy;
     }
+  else 
+      modified_name = (char *) name;
+
+  /* If we are using C++ language, demangle the name before doing a lookup, so
+     we can always binary search. */
+  if (current_language->la_language == language_cplus)
+    {
+      modified_name2 = cplus_demangle (modified_name, DMGL_ANSI | DMGL_PARAMS);
+      if (modified_name2)
+	{
+	  modified_name = modified_name2;
+	  needtofreename = 1;
+	}
+    }
+
+  returnval = lookup_symbol_aux (modified_name, block, namespace,
+				 is_a_field_of_this, symtab);
+  if (needtofreename)
+    free (modified_name2);
+
+  return returnval;	 
+}
+
+static struct symbol *
+lookup_symbol_aux (const char *name, const struct block *block,
+	       const namespace_enum namespace, int *is_a_field_of_this,
+	       struct symtab **symtab)
+{
+  register struct symbol *sym;
+  register struct symtab *s = NULL;
+  register struct partial_symtab *ps;
+  register struct blockvector *bv;
+  register struct objfile *objfile = NULL;
+  register struct block *b;
+  register struct minimal_symbol *msymbol;
 
+
   /* Search specified block and its superiors.  */
 
   while (block != 0)
@@ -987,7 +1027,7 @@ lookup_partial_symbol (struct partial_sy
 	    {
 	      do_linear_search = 1;
 	    }
-	  if (STRCMP (SYMBOL_NAME (*center), name) >= 0)
+	  if (STRCMP (SYMBOL_SOURCE_NAME (*center), name) >= 0)
 	    {
 	      top = center;
 	    }
@@ -1190,9 +1230,7 @@ lookup_block_symbol (register const stru
     {
       /* Reset the linear search flag so if the binary search fails, we
          won't do the linear search once unless we find some reason to
-         do so, such as finding a C++ symbol during the binary search.
-         Note that for C++ modules, ALL the symbols in a block should
-         end up marked as C++ symbols. */
+         do so */
 
       do_linear_search = 0;
       top = BLOCK_NSYMS (block);
@@ -1210,22 +1248,19 @@ lookup_block_symbol (register const stru
 	    }
 	  inc = (inc >> 1) + bot;
 	  sym = BLOCK_SYM (block, inc);
-	  if (!do_linear_search
-	      && (SYMBOL_LANGUAGE (sym) == language_cplus
-		  || SYMBOL_LANGUAGE (sym) == language_java
-	      ))
+	  if (!do_linear_search && (SYMBOL_LANGUAGE (sym) == language_java))
 	    {
 	      do_linear_search = 1;
 	    }
-	  if (SYMBOL_NAME (sym)[0] < name[0])
+	  if (SYMBOL_SOURCE_NAME (sym)[0] < name[0])
 	    {
 	      bot = inc;
 	    }
-	  else if (SYMBOL_NAME (sym)[0] > name[0])
+	  else if (SYMBOL_SOURCE_NAME (sym)[0] > name[0])
 	    {
 	      top = inc;
 	    }
-	  else if (STRCMP (SYMBOL_NAME (sym), name) < 0)
+	  else if (STRCMP (SYMBOL_SOURCE_NAME (sym), name) < 0)
 	    {
 	      bot = inc;
 	    }
@@ -1247,19 +1282,8 @@ lookup_block_symbol (register const stru
       while (bot < top)
 	{
 	  sym = BLOCK_SYM (block, bot);
-	  inc = SYMBOL_NAME (sym)[0] - name[0];
-	  if (inc == 0)
-	    {
-	      inc = STRCMP (SYMBOL_NAME (sym), name);
-	    }
-	  if (inc == 0 && SYMBOL_NAMESPACE (sym) == namespace)
-	    {
-	      return (sym);
-	    }
-	  if (inc > 0)
-	    {
-	      break;
-	    }
+	  if (SYMBOL_MATCHES_NAME (sym, name))
+	    return sym;
 	  bot++;
 	}
     }


Elena



Daniel Berlin writes:
 > 
 > Once again, I don't have a changelog handy to paste from.
 > It hasn't changed anyway, unless i'm misremembering.
 > I have an exam tomorrow, so it's quite possible i *am* misremembering,
 > and someone did request changelog modifications to the previous patch.
 > 
 > 
 > Elena, this includes the suggested modifications to lookup_symbol, so
 > that needstofreename gets initialized to 0, reducing the amount of
 > code. I have an odd feeling I missed something when changing that
 > code, so i'd appreciate it if you'd double check it for me.
 > It's probably just my stress level, but ....
 > 
 > Index: symfile.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/symfile.c,v
 > retrieving revision 1.18
 > diff -c -3 -p -r1.18 symfile.c
 > *** symfile.c	2000/09/02 00:09:06	1.18
 > --- symfile.c	2000/10/11 03:55:07
 > *************** compare_symbols (const PTR s1p, const PT
 > *** 212,219 ****
 >   
 >     s1 = (struct symbol **) s1p;
 >     s2 = (struct symbol **) s2p;
 > ! 
 > !   return (STRCMP (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2)));
 >   }
 >   
 >   /*
 > --- 212,218 ----
 >   
 >     s1 = (struct symbol **) s1p;
 >     s2 = (struct symbol **) s2p;
 > !   return (STRCMP (SYMBOL_SOURCE_NAME (*s1), SYMBOL_SOURCE_NAME (*s2)));
 >   }
 >   
 >   /*
 > *************** compare_symbols (const PTR s1p, const PT
 > *** 241,248 ****
 >   static int
 >   compare_psymbols (const PTR s1p, const PTR s2p)
 >   {
 > !   register char *st1 = SYMBOL_NAME (*(struct partial_symbol **) s1p);
 > !   register char *st2 = SYMBOL_NAME (*(struct partial_symbol **) s2p);
 >   
 >     if ((st1[0] - st2[0]) || !st1[0])
 >       {
 > --- 240,253 ----
 >   static int
 >   compare_psymbols (const PTR s1p, const PTR s2p)
 >   {
 > !   register struct partial_symbol **s1, **s2;
 > !   register char *st1, *st2;
 > ! 
 > !   s1 = (struct partial_symbol **) s1p;
 > !   s2 = (struct partial_symbol **) s2p;
 > !   st1 = SYMBOL_SOURCE_NAME (*s1);
 > !   st2 = SYMBOL_SOURCE_NAME (*s2);
 > ! 
 >   
 >     if ((st1[0] - st2[0]) || !st1[0])
 >       {
 > Index: symtab.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/symtab.c,v
 > retrieving revision 1.15
 > diff -c -3 -p -r1.15 symtab.c
 > *** symtab.c	2000/09/04 08:29:25	1.15
 > --- symtab.c	2000/10/11 03:55:08
 > *************** static struct partial_symbol *lookup_par
 > *** 83,88 ****
 > --- 83,95 ----
 >   
 >   static struct symtab *lookup_symtab_1 (char *);
 >   
 > + static struct symbol *lookup_symbol_aux (const char *name, const
 > + 					 struct block *block, const
 > + 					 namespace_enum namespace, int
 > + 					 *is_a_field_of_this, struct
 > + 					 symtab **symtab);
 > + 
 > + 
 >   static void cplusplus_hint (char *);
 >   
 >   static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
 > *************** fixup_psymbol_section (struct partial_sy
 > *** 572,588 ****
 >      can probably assume it will never hit the C++ code).  */
 >   
 >   struct symbol *
 > ! lookup_symbol (const char *name, register const struct block *block,
 >   	       const namespace_enum namespace, int *is_a_field_of_this,
 >   	       struct symtab **symtab)
 >   {
 > !   register struct symbol *sym;
 > !   register struct symtab *s = NULL;
 > !   register struct partial_symtab *ps;
 > !   struct blockvector *bv;
 > !   register struct objfile *objfile = NULL;
 > !   register struct block *b;
 > !   register struct minimal_symbol *msymbol;
 >   
 >     if (case_sensitivity == case_sensitive_off)
 >       {
 > --- 565,578 ----
 >      can probably assume it will never hit the C++ code).  */
 >   
 >   struct symbol *
 > ! lookup_symbol (const char *name, const struct block *block,
 >   	       const namespace_enum namespace, int *is_a_field_of_this,
 >   	       struct symtab **symtab)
 >   {
 > !   char *modified_name = NULL;
 > !   char *modified_name2 = NULL;
 > !   int needtofreename=0;
 > !   struct symbol *returnval;
 >   
 >     if (case_sensitivity == case_sensitive_off)
 >       {
 > *************** lookup_symbol (const char *name, registe
 > *** 594,601 ****
 >         for (i= 0; i < len; i++)
 >           copy[i] = tolower (name[i]);
 >         copy[len] = 0;
 > !       name = copy;
 >       }
 >   
 >     /* Search specified block and its superiors.  */
 >   
 > --- 584,630 ----
 >         for (i= 0; i < len; i++)
 >           copy[i] = tolower (name[i]);
 >         copy[len] = 0;
 > !       modified_name = copy;
 >       }
 > +   else 
 > +     {    
 > +       modified_name = (char *)name;
 > +     }
 > +   modified_name2 = modified_name; 
 > +   /* If we are using C++ language, demangle the name before doing a lookup, so
 > +      we can always binary search. */
 > +   if (current_language->la_language == language_cplus)
 > +     {
 > +       modified_name2 = cplus_demangle (modified_name, DMGL_ANSI |
 > + 				       DMGL_PARAMS);
 > +       needtofreename=1;
 > +     }
 > +   
 > +   if (!modified_name2)
 > +     {
 > +       modified_name2 = modified_name;
 > +     }
 > +   returnval = lookup_symbol_aux (modified_name2, block, namespace,
 > + 				 is_a_field_of_this, symtab);
 > +   if (needtofreename)
 > +     free(modified_name2);
 > + 
 > +   return returnval;	 
 > + }
 > + 
 > + static struct symbol *
 > + lookup_symbol_aux (const char *name, const struct block *block,
 > + 	       const namespace_enum namespace, int *is_a_field_of_this,
 > + 	       struct symtab **symtab)
 > + {
 > +   register struct symbol *sym;
 > +   register struct symtab *s = NULL;
 > +   register struct partial_symtab *ps;
 > +   register struct blockvector *bv;
 > +   register struct objfile *objfile = NULL;
 > +   register struct block *b;
 > +   register struct minimal_symbol *msymbol;
 > + 
 >   
 >     /* Search specified block and its superiors.  */
 >   
 > *************** lookup_partial_symbol (struct partial_sy
 > *** 987,993 ****
 >   	    {
 >   	      do_linear_search = 1;
 >   	    }
 > ! 	  if (STRCMP (SYMBOL_NAME (*center), name) >= 0)
 >   	    {
 >   	      top = center;
 >   	    }
 > --- 1017,1023 ----
 >   	    {
 >   	      do_linear_search = 1;
 >   	    }
 > ! 	  if (STRCMP (SYMBOL_SOURCE_NAME (*center), name) >= 0)
 >   	    {
 >   	      top = center;
 >   	    }
 > *************** lookup_block_symbol (register const stru
 > *** 1190,1198 ****
 >       {
 >         /* Reset the linear search flag so if the binary search fails, we
 >            won't do the linear search once unless we find some reason to
 > !          do so, such as finding a C++ symbol during the binary search.
 > !          Note that for C++ modules, ALL the symbols in a block should
 > !          end up marked as C++ symbols. */
 >   
 >         do_linear_search = 0;
 >         top = BLOCK_NSYMS (block);
 > --- 1220,1226 ----
 >       {
 >         /* Reset the linear search flag so if the binary search fails, we
 >            won't do the linear search once unless we find some reason to
 > !          do so */
 >   
 >         do_linear_search = 0;
 >         top = BLOCK_NSYMS (block);
 > *************** lookup_block_symbol (register const stru
 > *** 1210,1231 ****
 >   	    }
 >   	  inc = (inc >> 1) + bot;
 >   	  sym = BLOCK_SYM (block, inc);
 > ! 	  if (!do_linear_search
 > ! 	      && (SYMBOL_LANGUAGE (sym) == language_cplus
 > ! 		  || SYMBOL_LANGUAGE (sym) == language_java
 > ! 	      ))
 >   	    {
 >   	      do_linear_search = 1;
 >   	    }
 > ! 	  if (SYMBOL_NAME (sym)[0] < name[0])
 >   	    {
 >   	      bot = inc;
 >   	    }
 > ! 	  else if (SYMBOL_NAME (sym)[0] > name[0])
 >   	    {
 >   	      top = inc;
 >   	    }
 > ! 	  else if (STRCMP (SYMBOL_NAME (sym), name) < 0)
 >   	    {
 >   	      bot = inc;
 >   	    }
 > --- 1238,1256 ----
 >   	    }
 >   	  inc = (inc >> 1) + bot;
 >   	  sym = BLOCK_SYM (block, inc);
 > ! 	  if (!do_linear_search && (SYMBOL_LANGUAGE (sym) == language_java))
 >   	    {
 >   	      do_linear_search = 1;
 >   	    }
 > ! 	  if (SYMBOL_SOURCE_NAME (sym)[0] < name[0])
 >   	    {
 >   	      bot = inc;
 >   	    }
 > ! 	  else if (SYMBOL_SOURCE_NAME (sym)[0] > name[0])
 >   	    {
 >   	      top = inc;
 >   	    }
 > ! 	  else if (STRCMP (SYMBOL_SOURCE_NAME (sym), name) < 0)
 >   	    {
 >   	      bot = inc;
 >   	    }
 > *************** lookup_block_symbol (register const stru
 > *** 1247,1265 ****
 >         while (bot < top)
 >   	{
 >   	  sym = BLOCK_SYM (block, bot);
 > ! 	  inc = SYMBOL_NAME (sym)[0] - name[0];
 > ! 	  if (inc == 0)
 > ! 	    {
 > ! 	      inc = STRCMP (SYMBOL_NAME (sym), name);
 > ! 	    }
 > ! 	  if (inc == 0 && SYMBOL_NAMESPACE (sym) == namespace)
 > ! 	    {
 > ! 	      return (sym);
 > ! 	    }
 > ! 	  if (inc > 0)
 > ! 	    {
 > ! 	      break;
 > ! 	    }
 >   	  bot++;
 >   	}
 >       }
 > --- 1272,1279 ----
 >         while (bot < top)
 >   	{
 >   	  sym = BLOCK_SYM (block, bot);
 > ! 	  if (SYMBOL_MATCHES_NAME (sym, name))
 > ! 	    return sym;
 >   	  bot++;
 >   	}
 >       }
 > 
 > 
From ezannoni@cygnus.com Thu Oct 12 12:35:00 2000
From: Elena Zannoni <ezannoni@cygnus.com>
To: Daniel Berlin <dberlin@redhat.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: [PATCH] Mangling, take 2
Date: Thu, 12 Oct 2000 12:35:00 -0000
Message-id: <14822.4725.826556.108136@kwikemart.cygnus.com>
References: <m3lmvwdo71.fsf@dan2.cygnus.com>
X-SW-Source: 2000-10/msg00077.html
Content-length: 4857

I committed this one as well. With a ChangeLog entry!

Elena


Daniel Berlin writes:
 > This should be correct.
 > I don't have the changelogs handy to paste, I finally just checked out 5
 > seperate copies of the gdb tree so I could do rediffs there.
 > 
 > 
 > Any problems with this one that I missed?
 > Index: symtab.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/symtab.c,v
 > retrieving revision 1.15
 > diff -c -3 -p -r1.15 symtab.c
 > *** symtab.c	2000/09/04 08:29:25	1.15
 > --- symtab.c	2000/10/11 03:50:53
 > *************** gdb_mangle_name (struct type *type, int 
 > *** 296,301 ****
 > --- 303,311 ----
 >     char buf[20];
 >     int len = (newname == NULL ? 0 : strlen (newname));
 >   
 > +   if (OPNAME_PREFIX_P (field_name))
 > +     return xstrdup(physname);
 > + 
 >     is_full_physname_constructor =
 >       ((physname[0] == '_' && physname[1] == '_' &&
 >         (isdigit (physname[2]) || physname[2] == 'Q' || physname[2] == 't'))
 > *************** gdb_mangle_name (struct type *type, int 
 > *** 331,357 ****
 >         sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len);
 >       }
 >     mangled_name_len = ((is_constructor ? 0 : strlen (field_name))
 > ! 		      + strlen (buf) + len
 > ! 		      + strlen (physname)
 > ! 		      + 1);
 >   
 > -   /* Only needed for GNU-mangled names.  ANSI-mangled names
 > -      work with the normal mechanisms.  */
 > -   if (OPNAME_PREFIX_P (field_name))
 >       {
 > -       const char *opname = cplus_mangle_opname (field_name + 3, 0);
 > -       if (opname == NULL)
 > - 	error ("No mangling for \"%s\"", field_name);
 > -       mangled_name_len += strlen (opname);
 >         mangled_name = (char *) xmalloc (mangled_name_len);
 > - 
 > -       strncpy (mangled_name, field_name, 3);
 > -       mangled_name[3] = '\0';
 > -       strcat (mangled_name, opname);
 > -     }
 > -   else
 > -     {
 > -       mangled_name = (char *) xmalloc (mangled_name_len);
 >         if (is_constructor)
 >   	mangled_name[0] = '\0';
 >         else
 > --- 341,350 ----
 >         sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len);
 >       }
 >     mangled_name_len = ((is_constructor ? 0 : strlen (field_name))
 > ! 		      + strlen (buf) + len + strlen (physname) + 1);
 >   
 >       {
 >         mangled_name = (char *) xmalloc (mangled_name_len);
 >         if (is_constructor)
 >   	mangled_name[0] = '\0';
 >         else
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/symtab.h,v
 > retrieving revision 1.13
 > diff -c -3 -p -r1.13 symtab.h
 > *** symtab.h	2000/08/07 15:02:48	1.13
 > --- symtab.h	2000/10/11 03:50:53
 > *************** extern CORE_ADDR symbol_overlayed_addres
 > *** 170,175 ****
 > --- 170,177 ----
 >   #define SYMBOL_INIT_DEMANGLED_NAME(symbol,obstack)			\
 >     do {									\
 >       char *demangled = NULL;						\
 > +     if (SYMBOL_LANGUAGE (symbol) == language_unknown)                 \
 > +           SYMBOL_LANGUAGE(symbol) = language_auto;                    \
 >       if (SYMBOL_LANGUAGE (symbol) == language_cplus			\
 >   	|| SYMBOL_LANGUAGE (symbol) == language_auto)			\
 >         {									\
 > *************** extern CORE_ADDR symbol_overlayed_addres
 > *** 222,231 ****
 >   	    SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL;		\
 >   	  }								\
 >         }									\
 > -     if (SYMBOL_LANGUAGE (symbol) == language_auto)			\
 > -       {									\
 > - 	SYMBOL_LANGUAGE (symbol) = language_unknown;			\
 > -       }									\
 >     } while (0)
 >   
 >   /* Macro that returns the demangled name for a symbol based on the language
 > --- 224,229 ----
 > *************** struct partial_symtab
 > *** 1047,1059 ****
 >   #define VTBL_FNADDR_OFFSET 2
 >   
 >   /* Macro that yields non-zero value iff NAME is the prefix for C++ operator
 > !    names.  If you leave out the parenthesis here you will lose!
 > !    Currently 'o' 'p' CPLUS_MARKER is used for both the symbol in the
 > !    symbol-file and the names in gdb's symbol table.
 > !    Note that this macro is g++ specific (FIXME). */
 > ! 
 >   #define OPNAME_PREFIX_P(NAME) \
 > !   ((NAME)[0] == 'o' && (NAME)[1] == 'p' && is_cplus_marker ((NAME)[2]))
 >   
 >   /* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
 >      names.  Note that this macro is g++ specific (FIXME).
 > --- 1045,1053 ----
 >   #define VTBL_FNADDR_OFFSET 2
 >   
 >   /* Macro that yields non-zero value iff NAME is the prefix for C++ operator
 > !    names.  If you leave out the parenthesis here you will lose!  */
 >   #define OPNAME_PREFIX_P(NAME) \
 > !   (!strncmp(NAME,"operator",8))
 >   
 >   /* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
 >      names.  Note that this macro is g++ specific (FIXME).
 > 
 > 
 > 
From kevinb@cygnus.com Thu Oct 12 15:02:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: Kevin Buettner <kevinb@cygnus.com>, gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH RFC] Protoize remote-rdp.c, remote-sds.c, remote-sim.c
Date: Thu, 12 Oct 2000 15:02:00 -0000
Message-id: <1001012220154.ZM6317@ocotillo.lan>
References: <1001010054414.ZM1389@ocotillo.lan> <kevinb@cygnus.com>
X-SW-Source: 2000-10/msg00078.html
Content-length: 223

On Oct 9, 10:44pm, Kevin Buettner wrote:

> 	* remote-rdp.c (remote_rdp_xfer_inferior_memory): Protoize.
> 	* remote-sds.c (sds_xfer_memory): Protoize.
> 	* remote-sim.c (gdbsim_xfer_inferior_memory): Protoize.

Committed.
From kevinb@cygnus.com Thu Oct 12 15:05:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH RFC] Protoize remote-st.c, remote-utils.c, remote-vx.c
Date: Thu, 12 Oct 2000 15:05:00 -0000
Message-id: <1001012220502.ZM6323@ocotillo.lan>
X-SW-Source: 2000-10/msg00079.html
Content-length: 3446

More protoization...

Again, a FIXME comment was removed for reasons previously cited.

	* remote-st.c (st2000_xfer_inferior_memory): Protoize.
	* remote-utils.c (gr_multi_scan): Protoize.
	* remote-vx.c (vx_xfer_memory, net_get_symbols): Protoize.

Index: remote-st.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-st.c,v
retrieving revision 1.4
diff -u -r1.4 remote-st.c
--- remote-st.c	2000/09/01 00:12:10	1.4
+++ remote-st.c	2000/10/12 21:48:44
@@ -548,14 +548,15 @@
   return len;
 }
 
-/* FIXME-someday!  Merge these two.  */
+/* Transfer LEN bytes between GDB address MYADDR and target address
+   MEMADDR.  If WRITE is non-zero, transfer them to the target,
+   otherwise transfer them from the target.  TARGET is unused.
+
+   Returns the number of bytes transferred. */
+
 static int
-st2000_xfer_inferior_memory (memaddr, myaddr, len, write, target)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
-     int write;
-     struct target_ops *target;	/* ignored */
+st2000_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
+			     int write, struct target_ops *target)
 {
   if (write)
     return st2000_write_inferior_memory (memaddr, myaddr, len);
Index: remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-utils.c,v
retrieving revision 1.7
diff -u -r1.7 remote-utils.c
--- remote-utils.c	2000/09/01 00:12:10	1.7
+++ remote-utils.c	2000/10/12 21:48:44
@@ -502,9 +502,7 @@
    pass non-matching data on.  */
 
 int
-gr_multi_scan (list, passthrough)
-     char *list[];
-     int passthrough;
+gr_multi_scan (char *list[], int passthrough)
 {
   char *swallowed = NULL;	/* holding area */
   char *swallowed_p = swallowed;	/* Current position in swallowed.  */
Index: remote-vx.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-vx.c,v
retrieving revision 1.7
diff -u -r1.7 remote-vx.c
--- remote-vx.c	2000/08/27 22:30:29	1.7
+++ remote-vx.c	2000/10/12 21:48:46
@@ -468,19 +468,15 @@
 
 /* Copy LEN bytes to or from remote inferior's memory starting at MEMADDR
    to debugger memory starting at MYADDR.  WRITE is true if writing to the
-   inferior.
+   inferior.  TARGET is unused.
    Result is the number of bytes written or read (zero if error).  The
    protocol allows us to return a negative count, indicating that we can't
    handle the current address but can handle one N bytes further, but
    vxworks doesn't give us that information.  */
 
 static int
-vx_xfer_memory (memaddr, myaddr, len, write, target)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
-     int write;
-     struct target_ops *target;	/* ignored */
+vx_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
+		struct target_ops *target)
 {
   int status;
   Rptrace ptrace_in;
@@ -800,14 +796,14 @@
   return (status == RPC_SUCCESS) ? 0 : -1;
 }
 
-/* Fetch a list of loaded object modules from the VxWorks target.
+/* Fetch a list of loaded object modules from the VxWorks target
+   and store in PLOADTABLE.
    Returns -1 if rpc failed, 0 otherwise
    There's no way to check if the returned loadTable is correct.
    VxWorks doesn't check it.  */
 
 static int
-net_get_symbols (pLoadTable)
-     ldtabl *pLoadTable;	/* return pointer to ldtabl here */
+net_get_symbols (ldtabl *pLoadTable)
 {
   enum clnt_stat status;
 


      reply	other threads:[~2000-10-11 13:00 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-10-10 17:38 Daniel Berlin
     [not found] ` <dberlin@redhat.com>
2000-10-10 18:19   ` Kevin Buettner
2000-10-10 19:42     ` Daniel Berlin
2000-10-10 23:54 ` Eli Zaretskii
     [not found] ` <20001010211904.49719@cse.cygnus.com>
     [not found]   ` <m3bswsds9s.fsf@dan2.cygnus.com>
2000-10-11  9:53     ` DJ Delorie
2000-10-11 12:51       ` Daniel Berlin
     [not found]     ` <20001011130611.11730@cse.cygnus.com>
2000-10-11 12:55       ` Daniel Berlin
     [not found] ` <39E4AEE2.2213F615@apple.com>
     [not found]   ` <39E4B09A.D096436F@eagercon.com>
2000-10-11 12:55     ` Daniel Berlin
2000-10-11 13:00       ` Michael Snyder [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=39E4C6F3.5A2F@redhat.com \
    --to=msnyder@redhat.com \
    --cc=dberlin@redhat.com \
    --cc=eager@eagercon.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=shebs@apple.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox