public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c/4154: copy a structure argument with negative length (gcc3.0.1 mips3)
@ 2001-08-28  1:06 saito
  0 siblings, 0 replies; only message in thread
From: saito @ 2001-08-28  1:06 UTC (permalink / raw)
  To: gcc-gnats

>Number:         4154
>Category:       c
>Synopsis:       copy a structure argument with negative length (gcc3.0.1 mips3)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Aug 28 01:06:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Hideo Saito
>Release:        gcc-3.0.1
>Organization:
>Environment:
NetBSD-1.4.3 mips3(R5200) ELF
>Description:
When gcc passes some values and a structure argumnt to a function,
a structure argumnt is copied with negative length by memcpy().

FIX2 code generates same code as gcc-2.95.2 generates.
>How-To-Repeat:
struct sss {
        char buf[20];
};

xxx(int x, int y, struct sss s)
{
}

main()
{
        struct sss s0;

        xxx(0, 1, s0);
}

>Fix:
FIX1:

--- calls.c.org	Thu Aug 23 13:19:43 2001
+++ calls.c	Tue Aug 28 15:40:27 2001
@@ -4598,6 +4598,7 @@
 
       /*  If parm is passed both in stack and in register and offset is 
 	  greater than reg_parm_stack_space, split the offset. */
+#if 1
       if (arg->reg && arg->pass_on_stack)
 	{
 	  if (arg->offset.constant < reg_parm_stack_space && arg->offset.var)
@@ -4615,9 +4616,13 @@
 			    reg_parm_stack_space,
 			    ARGS_SIZE_RTX (arg->alignment_pad));
 
-	    size_rtx = GEN_INT (INTVAL(size_rtx) - reg_parm_stack_space);
+	    arg->value = change_address (arg->value, arg->mode,
+		plus_constant (XEXP (arg->value, 0), (INTVAL(size_rtx1))));
+	    arg->offset.constant += INTVAL(size_rtx1);
+	    size_rtx = GEN_INT (INTVAL(size_rtx) - INTVAL(size_rtx1));
 	  }
 	}
+#endif
 	
 
       emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx,

FIX2:
--- calls.c.org	Tue Aug 28 16:51:03 2001
+++ calls.c	Tue Aug 28 16:51:58 2001
@@ -4598,6 +4598,7 @@
 
       /*  If parm is passed both in stack and in register and offset is 
 	  greater than reg_parm_stack_space, split the offset. */
+#if 0
       if (arg->reg && arg->pass_on_stack)
 	{
 	  if (arg->offset.constant < reg_parm_stack_space && arg->offset.var)
@@ -4618,6 +4619,7 @@
 	    size_rtx = GEN_INT (INTVAL(size_rtx) - reg_parm_stack_space);
 	  }
 	}
+#endif
 	
 
       emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx,

>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2001-08-28  1:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-08-28  1:06 c/4154: copy a structure argument with negative length (gcc3.0.1 mips3) saito

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).