diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eea7d77ac0..ea3ed7b2f9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +Thu Jan 11 17:21:25 1996 Per Bothner + + * stabsread.c (define-symbol): Use invisible references + for TYPE_CODE_SET and TYPE_CODE_BITSTRING too. + * eval.c (evaluate_subexp_standard): When known, use the formal + parameter type as the expected type when evaluating arg expressions. + * ch-lang.c (evaluate_subexp_chill): Likewise (for MULTI_SUBSCRIPT). + Wed Jan 10 11:25:37 1996 Fred Fish * coredep.c: Renamed to core-aout.c diff --git a/gdb/ch-lang.c b/gdb/ch-lang.c index a76ae46427..9988a3c07a 100644 --- a/gdb/ch-lang.c +++ b/gdb/ch-lang.c @@ -424,6 +424,17 @@ evaluate_subexp_chill (expect_type, exp, pos, noside) argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 2)); argvec[0] = arg1; tem = 1; + if (type && TYPE_CODE (type) == TYPE_CODE_PTR) + type = check_typedef (TYPE_TARGET_TYPE (type)); + if (type && TYPE_CODE (type) == TYPE_CODE_FUNC) + { + for (; tem <= nargs && tem <= TYPE_NFIELDS (type); tem++) + { + argvec[tem] + = evaluate_subexp_chill (TYPE_FIELD_TYPE (type, tem-1), + exp, pos, noside); + } + } for (; tem <= nargs; tem++) argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside); argvec[tem] = 0; /* signal end of arglist */ diff --git a/gdb/eval.c b/gdb/eval.c index eaf0b29a7f..87417f34eb 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -283,7 +283,7 @@ evaluate_struct_tuple (struct_val, exp, pos, noside, nargs) field_type = TYPE_FIELD_TYPE (substruct_type, subfieldno); if (val == 0) - val = evaluate_subexp (substruct_type, exp, pos, noside); + val = evaluate_subexp (field_type, exp, pos, noside); /* Now actually set the field in struct_val. */ @@ -647,11 +647,15 @@ evaluate_subexp_standard (expect_type, exp, pos, noside) case OP_FUNCALL: (*pos) += 2; op = exp->elts[*pos].opcode; + nargs = longest_to_int (exp->elts[pc + 1].longconst); + /* Allocate arg vector, including space for the function to be + called in argvec[0] and a terminating NULL */ + argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 3)); if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { LONGEST fnptr; - nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1; + nargs++; /* First, evaluate the structure into arg2 */ pc2 = (*pos)++; @@ -719,7 +723,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside) /* Hair for method invocations */ int tem2; - nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1; + nargs++; /* First, evaluate the structure into arg2 */ pc2 = (*pos)++; tem2 = longest_to_int (exp->elts[pc2 + 1].longconst); @@ -754,15 +758,27 @@ evaluate_subexp_standard (expect_type, exp, pos, noside) } else { - nargs = longest_to_int (exp->elts[pc + 1].longconst); - tem = 0; + argvec[0] = evaluate_subexp_with_coercion (exp, pos, noside); + tem = 1; + type = VALUE_TYPE (argvec[0]); + if (type && TYPE_CODE (type) == TYPE_CODE_PTR) + type = TYPE_TARGET_TYPE (type); + if (type && TYPE_CODE (type) == TYPE_CODE_FUNC) + { + for (; tem <= nargs && tem <= TYPE_NFIELDS (type); tem++) + { + argvec[tem] = evaluate_subexp (TYPE_FIELD_TYPE (type, tem-1), + exp, pos, noside); + } + } } - /* Allocate arg vector, including space for the function to be - called in argvec[0] and a terminating NULL */ - argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 2)); + for (; tem <= nargs; tem++) - /* Ensure that array expressions are coerced into pointer objects. */ - argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside); + { + /* Ensure that array expressions are coerced into pointer objects. */ + + argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside); + } /* signal end of arglist */ argvec[tem] = 0; diff --git a/gdb/stabsread.c b/gdb/stabsread.c index ee22e65488..c81b21e5f5 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -1000,7 +1000,9 @@ define_symbol (valu, string, desc, type, objfile) && 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_UNION + || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_SET + || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_BITSTRING) #endif ) { @@ -1223,26 +1225,24 @@ 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. + the address in a register, not the structure itself. */ - 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 - && REG_STRUCT_HAS_ADDR (processing_gcc_compilation, + 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))) - 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, - SYMBOL_TYPE (sym)) - && ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT) - || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION))) - SYMBOL_CLASS (sym) = LOC_REF_ARG; + || (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 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; }