* printcmd.c (address_info): Use fprintf_symbol_filtered

to print the symbol name.

	* stabsread.c (define_symbol): Handle cfront lossage for
	struct/union/enums and typedefs.

	* partial-stab.h (case N_BINCL): Update psymtab_language
	as appropriate when changing subfiles.
	(case N_SOL): Update psymtab_language as appropriate when
	changing subfiles.  Add typedef for structs, unions, and enums
	when processing C++ files.
This commit is contained in:
Jeff Law 1993-11-11 23:27:21 +00:00
parent 3e80841e27
commit 91f8701603
4 changed files with 132 additions and 56 deletions

View file

@ -1,3 +1,17 @@
Thu Nov 11 15:22:20 1993 Jeffrey A. Law (law@snake.cs.utah.edu)
* printcmd.c (address_info): Use fprintf_symbol_filtered
to print the symbol name.
* stabsread.c (define_symbol): Handle cfront lossage for
struct/union/enums and typedefs.
* partial-stab.h (case N_BINCL): Update psymtab_language
as appropriate when changing subfiles.
(case N_SOL): Update psymtab_language as appropriate when
changing subfiles. Add typedef for structs, unions, and enums
when processing C++ files.
Thu Nov 11 13:18:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* README: Remove information on languages and just cite the (newly

View file

@ -240,69 +240,96 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
}
case N_BINCL:
{
#ifdef DBXREAD_ONLY
/* Add this bincl to the bincl_list for future EXCLs. No
need to save the string; it'll be around until
read_dbx_symtab function returns */
enum language tmp_language;
/* Add this bincl to the bincl_list for future EXCLs. No
need to save the string; it'll be around until
read_dbx_symtab function returns */
SET_NAMESTRING();
SET_NAMESTRING();
add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
tmp_language = deduce_language_from_filename (namestring);
/* Mark down an include file in the current psymtab */
/* Only change the psymtab's language if we've learned
something useful (eg. tmp_language is not language_unknown).
In addition, to match what start_subfile does, never change
from C++ to C. */
if (tmp_language != language_unknown
&& (tmp_language != language_c
|| psymtab_language != language_cplus))
psymtab_language = tmp_language;
goto record_include_file;
add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
/* Mark down an include file in the current psymtab */
goto record_include_file;
#else /* DBXREAD_ONLY */
continue;
#endif
case N_SOL:
/* Mark down an include file in the current psymtab */
SET_NAMESTRING();
/* In C++, one may expect the same filename to come round many
times, when code is coming alternately from the main file
and from inline functions in other files. So I check to see
if this is a file we've seen before -- either the main
source file, or a previously included file.
This seems to be a lot of time to be spending on N_SOL, but
things like "break c-exp.y:435" need to work (I
suppose the psymtab_include_list could be hashed or put
in a binary tree, if profiling shows this is a major hog). */
if (pst && STREQ (namestring, pst->filename))
continue;
{
register int i;
for (i = 0; i < includes_used; i++)
if (STREQ (namestring, psymtab_include_list[i]))
{
i = -1;
break;
}
if (i == -1)
continue;
#endif
}
#ifdef DBXREAD_ONLY
record_include_file:
#endif
psymtab_include_list[includes_used++] = namestring;
if (includes_used >= includes_allocated)
case N_SOL:
{
enum language tmp_language;
/* Mark down an include file in the current psymtab */
SET_NAMESTRING();
tmp_language = deduce_language_from_filename (namestring);
/* Only change the psymtab's language if we've learned
something useful (eg. tmp_language is not language_unknown).
In addition, to match what start_subfile does, never change
from C++ to C. */
if (tmp_language != language_unknown
&& (tmp_language != language_c
|| psymtab_language != language_cplus))
psymtab_language = tmp_language;
/* In C++, one may expect the same filename to come round many
times, when code is coming alternately from the main file
and from inline functions in other files. So I check to see
if this is a file we've seen before -- either the main
source file, or a previously included file.
This seems to be a lot of time to be spending on N_SOL, but
things like "break c-exp.y:435" need to work (I
suppose the psymtab_include_list could be hashed or put
in a binary tree, if profiling shows this is a major hog). */
if (pst && STREQ (namestring, pst->filename))
continue;
{
char **orig = psymtab_include_list;
psymtab_include_list = (char **)
alloca ((includes_allocated *= 2) *
sizeof (char *));
memcpy ((PTR)psymtab_include_list, (PTR)orig,
includes_used * sizeof (char *));
register int i;
for (i = 0; i < includes_used; i++)
if (STREQ (namestring, psymtab_include_list[i]))
{
i = -1;
break;
}
if (i == -1)
continue;
}
continue;
#ifdef DBXREAD_ONLY
record_include_file:
#endif
psymtab_include_list[includes_used++] = namestring;
if (includes_used >= includes_allocated)
{
char **orig = psymtab_include_list;
psymtab_include_list = (char **)
alloca ((includes_allocated *= 2) *
sizeof (char *));
memcpy ((PTR)psymtab_include_list, (PTR)orig,
includes_used * sizeof (char *));
}
continue;
}
case N_LSYM: /* Typedef or automatic variable. */
case N_STSYM: /* Data seg var -- static */
case N_LCSYM: /* BSS " */
@ -375,6 +402,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
objfile);
p += 1;
}
/* The semantics of C++ state that "struct foo { ... }"
also defines a typedef for "foo". Unfortuantely, cfront
never makes the typedef when translating from C++ to C.
We make the typedef here so that "ptype foo" works as
expected for cfront translated code. */
else if (psymtab_language == language_cplus)
{
/* Also a typedef with the same name. */
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_TYPEDEF,
objfile->static_psymbols,
CUR_SYMBOL_VALUE, psymtab_language,
objfile);
}
}
goto check_enum;
case 't':

View file

@ -883,22 +883,32 @@ address_info (exp, from_tty)
{
if (is_a_field_of_this)
{
printf_unfiltered ("Symbol \"%s\" is a field of the local class variable `this'\n", exp);
printf_unfiltered ("Symbol \"");
fprintf_symbol_filtered (gdb_stdout, exp,
current_language->la_language, DMGL_ANSI);
printf_unfiltered ("\" is a field of the local class variable `this'\n");
return;
}
msymbol = lookup_minimal_symbol (exp, (struct objfile *) NULL);
if (msymbol != NULL)
printf_unfiltered ("Symbol \"%s\" is at %s in a file compiled without debugging.\n",
exp,
local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (msymbol)));
{
printf_unfiltered ("Symbol \"");
fprintf_symbol_filtered (gdb_stdout, exp,
current_language->la_language, DMGL_ANSI);
printf_unfiltered ("\" is at %s in a file compiled without debugging.\n",
local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (msymbol)));
}
else
error ("No symbol \"%s\" in current context.", exp);
return;
}
printf_unfiltered ("Symbol \"%s\" is ", SYMBOL_NAME (sym));
printf_unfiltered ("Symbol \"");
fprintf_symbol_filtered (gdb_stdout, SYMBOL_NAME (sym),
current_language->la_language, DMGL_ANSI);
printf_unfiltered ("\" is ", SYMBOL_NAME (sym));
val = SYMBOL_VALUE (sym);
basereg = SYMBOL_BASEREG (sym);

View file

@ -1035,6 +1035,17 @@ define_symbol (valu, string, desc, type, objfile)
strlen (SYMBOL_NAME (sym)),
&objfile -> symbol_obstack);
}
/* The semantics of C++ state that "struct foo { ... }" also defines
a typedef for "foo". Unfortunately, cfront never makes the typedef
when translating C++ into C. We make the typedef here so that
"ptype foo" works as expected for cfront translated code. */
else if (current_subfile->language == language_cplus)
{
synonym = 1;
type_synonym_name = obsavestring (SYMBOL_NAME (sym),
strlen (SYMBOL_NAME (sym)),
&objfile -> symbol_obstack);
}
SYMBOL_TYPE (sym) = read_type (&p, objfile);