From f26137106836aa7d2d733f775c4f1cd9e07b6fc5 Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Thu, 10 Mar 1994 18:21:02 +0000 Subject: [PATCH] * stabsread.c (define_symbol): If REG_STRUCT_HAS_ADDR, also convert a LOC_ARG to a LOC_REF_ARG. Update code which combines 'p' and 'r' symbol descriptors into a single symbol to look for a LOC_REF_ARG. * README, config/sparc/tm-sparc.h: Update comments. --- gdb/config/sparc/tm-sparc.h | 4 +--- gdb/stabsread.c | 10 +++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gdb/config/sparc/tm-sparc.h b/gdb/config/sparc/tm-sparc.h index 69899b868c3..5fe91a8627f 100644 --- a/gdb/config/sparc/tm-sparc.h +++ b/gdb/config/sparc/tm-sparc.h @@ -28,10 +28,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ not the structure itself. It (under SunOS4) creates two symbols, which we need to combine to a LOC_REGPARM. Gcc version two (as of 1.92) behaves like sun cc. REG_STRUCT_HAS_ADDR is smart enough to - distinguish between Sun cc, gcc version 1 and gcc version 2. + distinguish between Sun cc, gcc version 1 and gcc version 2. */ - This still doesn't work if the argument is not one passed in a - register (i.e. it's the 7th or later argument). */ #define REG_STRUCT_HAS_ADDR(gcc_p) (gcc_p != 1) /* Sun /bin/cc gets this right as of SunOS 4.1.x. We need to define diff --git a/gdb/stabsread.c b/gdb/stabsread.c index 4a6ccdaecfb..ec88be17103 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -989,7 +989,7 @@ define_symbol (valu, string, desc, type, objfile) { struct symbol *prev_sym; prev_sym = local_symbols->symbol[local_symbols->nsyms - 1]; - if (SYMBOL_CLASS (prev_sym) == LOC_ARG + if (SYMBOL_CLASS (prev_sym) == LOC_REF_ARG && STREQ (SYMBOL_NAME (prev_sym), SYMBOL_NAME(sym))) { SYMBOL_CLASS (prev_sym) = LOC_REGPARM; @@ -1181,6 +1181,14 @@ define_symbol (valu, string, desc, type, objfile) || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION))) 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). */ + if (SYMBOL_CLASS (sym) == LOC_ARG + && REG_STRUCT_HAS_ADDR (processing_gcc_compilation) + && ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT) + || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION))) + SYMBOL_CLASS (sym) = LOC_REF_ARG; + return sym; }