* stabsread.c (define_symbol): Only combine a p/r pair into a

LOC_REGPARM if REG_STRUCT_HAS_ADDR.
This commit is contained in:
Jim Kingdon
1993-12-25 19:50:45 +00:00
parent 008d4449a7
commit 28f851f93a
2 changed files with 23 additions and 7 deletions

View File

@ -1,3 +1,8 @@
Sat Dec 25 13:39:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* stabsread.c (define_symbol): Only combine a p/r pair into a
LOC_REGPARM if REG_STRUCT_HAS_ADDR.
Sat Dec 25 09:50:29 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) Sat Dec 25 09:50:29 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* valops.c (value_struct_elt): Check for (value)-1 return from * valops.c (value_struct_elt): Check for (value)-1 return from

View File

@ -450,6 +450,10 @@ read_type_number (pp, typenums)
static char *type_synonym_name; static char *type_synonym_name;
#if !defined (REG_STRUCT_HAS_ADDR)
#define REG_STRUCT_HAS_ADDR(gcc_p) 0
#endif
/* ARGSUSED */ /* ARGSUSED */
struct symbol * struct symbol *
define_symbol (valu, string, desc, type, objfile) define_symbol (valu, string, desc, type, objfile)
@ -925,16 +929,27 @@ define_symbol (valu, string, desc, type, objfile)
SYMBOL_VALUE (sym) = SP_REGNUM; /* Known safe, though useless */ SYMBOL_VALUE (sym) = SP_REGNUM; /* Known safe, though useless */
} }
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
if (within_function) if (within_function
&& REG_STRUCT_HAS_ADDR (processing_gcc_compilation)
&& (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
|| TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION))
{ {
/* Sun cc uses a pair of symbols, one 'p' and one 'r' with the same /* Sun cc uses a pair of symbols, one 'p' and one 'r' with the same
name to represent an argument passed in a register. name to represent an argument passed in a register.
GCC uses 'P' for the same case. So if we find such a symbol pair GCC uses 'P' for the same case. So if we find such a symbol pair
we combine it into one 'P' symbol. we combine it into one 'P' symbol.
But we only do this in the REG_STRUCT_HAS_ADDR case, so that
we can still get information about what is going on with the
stack (VAX for computing args_printed, possible future changes
to use stack slots instead of saved registers in backtraces,
etc.).
Note that this code illegally combines Note that this code illegally combines
main(argc) int argc; { register int argc = 1; } main(argc) struct foo argc; { register struct foo argc; }
but this case is considered pathological and causes a warning but this case is considered pathological and causes a warning
from a decent compiler. */ from a decent compiler. */
if (local_symbols if (local_symbols
&& local_symbols->nsyms > 0) && local_symbols->nsyms > 0)
{ {
@ -1123,10 +1138,6 @@ define_symbol (valu, string, desc, type, objfile)
If REG_STRUCT_HAS_ADDR yields non-zero we have to convert LOC_REGPARM If REG_STRUCT_HAS_ADDR yields non-zero we have to convert LOC_REGPARM
to LOC_REGPARM_ADDR for structures and unions. */ to LOC_REGPARM_ADDR for structures and unions. */
#if !defined (REG_STRUCT_HAS_ADDR)
#define REG_STRUCT_HAS_ADDR(gcc_p) 0
#endif
if (SYMBOL_CLASS (sym) == LOC_REGPARM if (SYMBOL_CLASS (sym) == LOC_REGPARM
&& REG_STRUCT_HAS_ADDR (processing_gcc_compilation) && REG_STRUCT_HAS_ADDR (processing_gcc_compilation)
&& ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT) && ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)