aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-05-06 23:00:15 +0000
committerRichard Stallman <rms@gnu.org>1992-05-06 23:00:15 +0000
commitdad0145a312f30add10804c200b8d662c2eefe13 (patch)
tree1d2d4de05d4e71aeef4a5c504065508aece26848 /gcc
parent95949d0ccc73f4bef55fe213c4b1d817cc25ca5b (diff)
downloadgcc-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.c48
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. */