This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PING [RFC] Support for const char and strings in stabs reader


  The official stabs reader maintainer
is Elena Zannoni, but I could find any recent 
email from her on this or on gdb list.
I wonder if se is still reading this list.

  Is there someone else able to review this patch
or should I try to contact Elena directly?

Pierre Muller

> -----Message d'origine-----
> De?: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Pierre Muller
> Envoyé?: Tuesday, March 16, 2010 10:11 PM
> À?: gdb-patches@sourceware.org
> Objet?: [RFC] Support for const char and strings in stabs reader
> 
>   Stabs reader currently only supports constants
> of integer, real or enum types.
> 
>   This patch adds support for char and string types, as described in
> http://sourceware.org/gdb/current/onlinedocs/stabs/Constants.html#Const
> ants
> 
>   I tried to implement support for both single and double
> quote in the code.
>  The string type is currently used for
> Free Pascal compiler, so I could directly test it.
> 
>   I also tried to add some check to gdb.stabs testsuite,
> but I got caught by some typical tcl expansion
> problems while trying to test the second form
> using double quotes...
> 
> 
> The original lines in gdb.stabs/weird.def
> # Test string constant
> .stabs "constString1:c=s'String1'", N_LSYM,0,0, 0
> .stabs "constString2:c=s\"String2\"", N_LSYM,0,0, 0
> .stabs "constString3:c=s'String3 with embedded quote \' in the
> middle'",
> N_LSYM,0,0, 0
> 
> become
> 
> .stabs "constString1:c=s'String1'", 0x80,0,0, 0
> .stabs "constString2:c=s\\"String2\"", 0x80,0,0, 0
> .stabs "constString3:c=s'String3 with embedded quote \\' in the
> middle'",
> 0x80,0,0, 0
> 
> Note the fact that only one of the two escaped double quote
> is transformed into \\"..
> I tried all combination, and nothing seemed to work...
> 
> 
> Comments welcome,
> 
> 
> Pierre Muller
> Pascal language support maintainer for GDB
> 
> PS: I left the boolean support out
> because currently objfile builtin_types
> do not have a builtin_bool, which would be required
> here.
> 
> 
> 2010-03-16  Pierre Muller  <muller@ics.u-strasbg.fr>
> 
> 	* stabsread.c (define_symbol): Add support for char
> 	and string constants.
> 
> Index: stabsread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/stabsread.c,v
> retrieving revision 1.123
> diff -u -p -r1.123 stabsread.c
> --- stabsread.c	8 Jan 2010 08:55:16 -0000	1.123
> +++ stabsread.c	16 Mar 2010 21:07:48 -0000
> @@ -793,6 +793,56 @@ define_symbol (CORE_ADDR valu, char *str
>  	    SYMBOL_CLASS (sym) = LOC_CONST;
>  	  }
>  	  break;
> +
> +	case 'c':
> +	  {
> +	    SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_char;
> +	    SYMBOL_VALUE (sym) = atoi (p);
> +	    SYMBOL_CLASS (sym) = LOC_CONST;
> +	  }
> +	  break;
> +
> +	case 's':
> +	  {
> +            struct type *range_type;
> +	    char quote = *p++;
> +            char *startp = p;
> +            gdb_byte *string_value;
> +            if (quote != '\'' && quote != '"')
> +              {
> +                SYMBOL_CLASS (sym) = LOC_CONST;
> +                SYMBOL_TYPE (sym) = error_type (&p, objfile);
> +                SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
> +                add_symbol_to_list (sym, &file_symbols);
> +                return sym;
> +              }
> +            /* Find matching quote, rejecting escaped quotes.  */
> +            while (*p && *p != quote)
> +              {
> +                if (*p == '\\')
> +                  p++;
> +                if (*p)
> +                  p++;
> +              }
> +            *p = '\0';
> +            range_type = create_range_type (NULL,
> +                           objfile_type (objfile)->builtin_int,
> +                           0, strlen(startp));
> + 	    SYMBOL_TYPE (sym) = create_array_type (NULL,
> +              objfile_type (objfile)->builtin_char,
> +              range_type);
> +	    string_value =
> +	      obstack_alloc (&objfile->objfile_obstack,
> +			     strlen (startp) + 1);
> +	    strcpy ((char *)string_value, startp);
> +            *p = quote;
> +            p++;
> +
> +	    SYMBOL_VALUE_BYTES (sym) = string_value;
> +	    SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
> +	  }
> +	  break;
> +
>  	case 'e':
>  	  /* SYMBOL:c=eTYPE,INTVALUE for a constant symbol whose value
>  	     can be represented as integral.
> Index: testsuite/gdb.stabs/weird.def
> ===================================================================
> RCS file: /cvs/src/src/gdb/testsuite/gdb.stabs/weird.def,v
> retrieving revision 1.3
> diff -u -p -r1.3 weird.def
> --- testsuite/gdb.stabs/weird.def	8 Jan 2010 08:55:16 -0000	1.3
> +++ testsuite/gdb.stabs/weird.def	16 Mar 2010 21:07:49 -0000
> @@ -286,6 +286,15 @@ attr69:
>  # Test constant with the type embedded.
>  .stabs "const70:c=e190=bs2;0;16;,70", N_LSYM,0,0, 0
> 
> +# Test char constant
> +.stabs "constchar:c=70", N_LSYM,0,0, 0
> +
> +# Test string constant
> +.stabs "constString1:c=s'String1'", N_LSYM,0,0, 0
> +.stabs "constString2:c=s\"String2\"", N_LSYM,0,0, 0
> +.stabs "constString3:c=s'String3 with embedded quote \' in the
> middle'",
> N_LSYM,0,0, 0
> +
> +
>  .stabs "attr38:G338=@&
> !#$%&'()*+,-
> ./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmno
> pqrstuvwxyz{|}~;1",N_GSYM,0,0, 0
> 
>  # Unrecognized negative type number.
> Index: testsuite/gdb.stabs/weird.exp
> ===================================================================
> RCS file: /cvs/src/src/gdb/testsuite/gdb.stabs/weird.exp,v
> retrieving revision 1.18
> diff -u -p -r1.18 weird.exp
> --- testsuite/gdb.stabs/weird.exp	1 Jan 2010 07:32:06 -0000	1.18
> +++ testsuite/gdb.stabs/weird.exp	16 Mar 2010 21:07:49 -0000
> @@ -164,6 +164,11 @@ proc do_tests {} {
> 
>  	gdb_test "p sizeof (const70)" " = 2" "'e' constant with embedded
> type"
> 
> +	   gdb_test "p /x constchar" " = 0x46" "char constant"
> +        gdb_test "p constString1" " = \"String1\"" "String constant 1"
> +        gdb_test "p constString2" " = \"String2\"" "String constant 2"
> +        gdb_test "p constString3" " = \"String3 with embedded quote '
> in
> the middle\"" "String constant 3"
> +
>  	gdb_test "p bad_neg0" " = \{field0 = 42, field2 =.*field3 = 45\}"
> "p
> bad_neg0"
> 
>  	gdb_test "ptype inttype" "type = (unsigned int|inttype)" "ptype
> on
> inttype"



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]