* stabsread.c (define_symbol): If REG_STRUCT_HAS_ADDR is non-zero,

follow typedefs before checking TYPE_CODE for structures and unions.
This commit is contained in:
Peter Schauer
1996-10-13 18:40:26 +00:00
parent 8918b3a72b
commit 19406903ab

View File

@ -1777,21 +1777,25 @@ define_symbol (valu, string, desc, type, objfile)
/* When passing structures to a function, some systems sometimes pass
the address in a register, not the structure itself. */
if (REG_STRUCT_HAS_ADDR (processing_gcc_compilation,
SYMBOL_TYPE (sym))
&& ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
|| (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)
|| (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_BITSTRING)
|| (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_SET)))
if (REG_STRUCT_HAS_ADDR (processing_gcc_compilation, SYMBOL_TYPE (sym))
&& (SYMBOL_CLASS (sym) == LOC_REGPARM || SYMBOL_CLASS (sym) == LOC_ARG))
{
/* If REG_STRUCT_HAS_ADDR yields non-zero we have to
convert LOC_REGPARM to LOC_REGPARM_ADDR for structures and unions. */
if (SYMBOL_CLASS (sym) == LOC_REGPARM)
SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
/* Likewise for converting LOC_ARG to LOC_REF_ARG (for the 7th and
subsequent arguments on the sparc, for example). */
else if (SYMBOL_CLASS (sym) == LOC_ARG)
SYMBOL_CLASS (sym) = LOC_REF_ARG;
struct type *symbol_type = check_typedef (SYMBOL_TYPE (sym));
if ((TYPE_CODE (symbol_type) == TYPE_CODE_STRUCT)
|| (TYPE_CODE (symbol_type) == TYPE_CODE_UNION)
|| (TYPE_CODE (symbol_type) == TYPE_CODE_BITSTRING)
|| (TYPE_CODE (symbol_type) == TYPE_CODE_SET))
{
/* If REG_STRUCT_HAS_ADDR yields non-zero we have to convert
LOC_REGPARM to LOC_REGPARM_ADDR for structures and unions. */
if (SYMBOL_CLASS (sym) == LOC_REGPARM)
SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
/* Likewise for converting LOC_ARG to LOC_REF_ARG (for the 7th
and subsequent arguments on the sparc, for example). */
else if (SYMBOL_CLASS (sym) == LOC_ARG)
SYMBOL_CLASS (sym) = LOC_REF_ARG;
}
}
return sym;