diff options
author | Richard Stallman <rms@gnu.org> | 1992-05-06 23:00:15 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-05-06 23:00:15 +0000 |
commit | dad0145a312f30add10804c200b8d662c2eefe13 (patch) | |
tree | 1d2d4de05d4e71aeef4a5c504065508aece26848 /gcc | |
parent | 95949d0ccc73f4bef55fe213c4b1d817cc25ca5b (diff) | |
download | gcc-dad0145a312f30add10804c200b8d662c2eefe13.zip gcc-dad0145a312f30add10804c200b8d662c2eefe13.tar.gz gcc-dad0145a312f30add10804c200b8d662c2eefe13.tar.bz2 |
*** empty log message ***
From-SVN: r924
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/dbxout.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/gcc/dbxout.c b/gcc/dbxout.c index 38bbd22..c82eb00 100644 --- a/gcc/dbxout.c +++ b/gcc/dbxout.c @@ -853,7 +853,13 @@ dbxout_type (type, full, show_arg_types) case TYPE_UNSEEN: break; case TYPE_XREF: - if (! full) + /* If we have already had a cross reference, + and either that's all we want or that's the best we could do, + don't repeat the cross reference. + Sun dbx crashes if we do. */ + if (! full || TYPE_SIZE (type) == 0 + /* No way in DBX fmt to describe a variable size. */ + || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) return; break; case TYPE_DEFINED: @@ -1847,6 +1853,46 @@ dbxout_parms (parms) dbxout_finish_symbol (parms); } else if (GET_CODE (DECL_RTL (parms)) == MEM + && GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG + && rtx_equal_p (XEXP (DECL_RTL (parms), 0), + DECL_INCOMING_RTL (parms))) + { + /* Parm was passed via invisible reference. + That is, its address was passed in a register. + Output it as if it lived in that register. + The debugger will know from the type + that it was actually passed by invisible reference. */ + + char regparm_letter; + /* Parm passed in registers and lives in registers or nowhere. */ + + current_sym_code = DBX_REGPARM_STABS_CODE; + regparm_letter = DBX_REGPARM_STABS_LETTER; + + /* DECL_RTL looks like (MEM (REG...). Get the register number. */ + current_sym_value = REGNO (XEXP (DECL_RTL (parms), 0)); + current_sym_addr = 0; + + FORCE_TEXT; + if (DECL_NAME (parms)) + { + current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms))); + + fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP, + IDENTIFIER_POINTER (DECL_NAME (parms)), + DBX_REGPARM_STABS_LETTER); + } + else + { + current_sym_nchars = 8; + fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP, + DBX_REGPARM_STABS_LETTER); + } + + dbxout_type (TREE_TYPE (parms), 0, 0); + dbxout_finish_symbol (parms); + } + else if (GET_CODE (DECL_RTL (parms)) == MEM && XEXP (DECL_RTL (parms), 0) != const0_rtx) { /* Parm was passed in registers but lives on the stack. */ |