* gdb/stabsread.c (define_symbol): Add support for char

and string constants.

	* gdb/testsuite/gdb.stabs/aout.sed: Convert all backslash to double backslash
	within one line, unless it is followed by a double quote.
	* gdb/testsuite/gdb.stabs/hppa.sed: Idem.
	* gdb/testsuite/gdb.stabs/weird.def: Add char and String constants
	* gdb/testsuite/gdb.stabs/weird.exp: Check for correct parsing of
	chhar and string constants.
	* gdb/testsuite/gdb.stabs/xcoff.sed: Ignore escaped quote quotes
	in .stabs to .stabx substitution.
This commit is contained in:
Pierre Muller 2010-04-05 22:43:49 +00:00
parent 2244ba2e4a
commit ec8a089a30
8 changed files with 114 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2010-04-06 Pierre Muller <muller@ics.u-strasbg.fr>
* stabsread.c (define_symbol): Add support for char
and string constants.
2010-04-06 Pierre Muller <muller@ics.u-strasbg.fr>
Remove remaining "%ll" uses.

View File

@ -793,6 +793,75 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
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;
int ind = 0;
char quote = *p++;
char *startp = p;
gdb_byte *string_local = (gdb_byte *) alloca (strlen (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[1] == quote)
{
string_local[ind] = (gdb_byte) quote;
ind++;
p += 2;
}
else if (*p)
{
string_local[ind] = (gdb_byte) (*p);
ind++;
p++;
}
}
if (*p != 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;
}
/* NULL terminate the string. */
string_local[ind] = 0;
range_type = create_range_type (NULL,
objfile_type (objfile)->builtin_int,
0, ind);
SYMBOL_TYPE (sym) = create_array_type (NULL,
objfile_type (objfile)->builtin_char,
range_type);
string_value = obstack_alloc (&objfile->objfile_obstack, ind + 1);
memcpy (string_value, string_local, ind + 1);
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.

View File

@ -1,3 +1,14 @@
2010-04-06 Pierre Muller <muller@ics.u-strasbg.fr>
* gdb.stabs/aout.sed: Convert all backslash to double backslash
within one line, unless it is followed by a double quote.
* gdb.stabs/hppa.sed: Idem.
* gdb.stabs/weird.def: Add char and String constants
* gdb.stabs/weird.exp: Check for correct parsing of
chhar and string constants.
* gdb.stabs/xcoff.sed: Ignore escaped quote quotes
in .stabs to .stabx substitution.
2010-04-05 Stan Shebs <stan@codesourcery.com>
* gdb.trace/tfile.c: Add a variable split across two blocks, and a

View File

@ -9,7 +9,7 @@ Label0:
s/N_LSYM/0x80/
s/N_GSYM/0x20/
s/# Replace a single backslash with a doubled backslash//
/\.stabs/s/\\/\\\\/
/\.stabs/s/\\\([^"]\)/\\\\\1/g
s/\.begin_common\(.*\)/.stabs \1,0xe2,0,0,0/
s/\.end_common\(.*\)/.stabs \1,0xe4,0,0,0/
s/\.align_it/.align 2/

View File

@ -9,7 +9,7 @@ Label0:
s/N_LSYM/0x80/
s/N_GSYM/0x20/
s/# Replace a single backslash with a doubled backslash//
/\.stabs/s/\\/\\\\/
/\.stabs/s/\\/\\\\/g
s/# Only labels should be at the beginning of a line, assembler directives//
s/# and instructions should start somewhere after column zero.//
/^\./s/^\./ ./

View File

@ -286,6 +286,20 @@ 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=c97", N_LSYM,0,0, 0
# Test string constant
.stabs "constString1:c=s'Single quote String1'", N_LSYM,0,0, 0
# Using double quotes requires an escaping, as the stabs string
# is a double quote delimited string.
.stabs "constString2:c=s\"Double quote String2\"", N_LSYM,0,0, 0
# Escaping sinlge quote with is easy
.stabs "constString3:c=s'String3 with embedded quote \' in the middle'", N_LSYM,0,0, 0
# Esaping double quotes is less clear...
.stabs "constString4:c=s\"String4 with embedded quote \\" in the middle\"", N_LSYM,0,0, 0
.stabs "attr38:G338=@& !#$%&'()*+,-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~;1",N_GSYM,0,0, 0
# Unrecognized negative type number.

View File

@ -164,6 +164,12 @@ proc do_tests {} {
gdb_test "p sizeof (const70)" " = 2" "'e' constant with embedded type"
gdb_test "p constchar" " = 97 'a'" "char constant"
gdb_test "p constString1" " = \"Single quote String1\"" "String constant 1"
gdb_test "p constString2" " = \"Double quote String2\"" "String constant 2"
gdb_test "p constString3" " = \"String3 with embedded quote ' in the middle\"" "String constant 3"
gdb_test "p constString4" { = "String4 with embedded quote \\" in the middle"} "String constant 4"
gdb_test "p bad_neg0" " = \{field0 = 42, field2 =.*field3 = 45\}" "p bad_neg0"
gdb_test "ptype inttype" "type = (unsigned int|inttype)" "ptype on inttype"
@ -251,6 +257,8 @@ proc print_weird_var { var } {
global target_os
set sedscript ${srcdir}/${subdir}/aout.sed
set sedoptions ""
switch -glob ${target_triplet} {
"hppa*-*-*" {
set sedscript ${srcdir}/${subdir}/hppa.sed
@ -260,15 +268,18 @@ switch -glob ${target_triplet} {
}
"powerpc-*-aix*" {
set sedscript ${srcdir}/${subdir}/xcoff.sed
set sedoptions "-r"
}
"rs6000-*-aix*" {
set sedscript ${srcdir}/${subdir}/xcoff.sed
set sedoptions "-r"
}
"*-*-aout" {
set sedscript ${srcdir}/${subdir}/aout.sed
}
"*-*-xcoff" {
set sedscript ${srcdir}/${subdir}/xcoff.sed
set sedoptions "-r"
}
"alpha-*-*" {
set sedscript ${srcdir}/${subdir}/ecoff.sed
@ -276,7 +287,7 @@ switch -glob ${target_triplet} {
}
# Hope this is a Unix box.
set exec_output [remote_exec build "sed" "-f ${sedscript}" "${srcdir}/${subdir}/weird.def" "${srcfile}"]
set exec_output [remote_exec build "sed" "${sedoptions} -f ${sedscript}" "${srcdir}/${subdir}/weird.def" "${srcfile}"]
if { [lindex $exec_output 0] != 0 } {
perror "Couldn't make test case. $exec_output"
return -1

View File

@ -4,7 +4,7 @@
1i\
.csect .data[RW]
# .stabs string,type,0,0,value -> .stabx string,value,type,0
s/^[ ]*\.stabs[ ]*\("[^"]*"\),[ ]*\([^,]*\),[ ]*0,0,[ ]*\(.*\)$/.stabx \1,\3,\2,0/
s/^[ ]*\.stabs[ ]*("(\"|[^"])*"),[ ]*([^,]*),[ ]*0,0,[ ]*(.*)$/.stabx \1,\4,\3,0/
s/N_GSYM/128/
# This needs to be C_DECL, which is used for types, not C_LSYM, which is
# ignored on the initial scan.