public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: snyder@fnal.gov To: gcc-gnats@gcc.gnu.org Subject: c++/9722: g++ 3.4: structure passing bug Date: Mon, 17 Feb 2003 15:06:00 -0000 [thread overview] Message-ID: <200302162234.QAA19603@d0mino.fnal.gov> (raw) >Number: 9722 >Category: c++ >Synopsis: g++ 3.4: structure passing bug >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Mon Feb 17 15:06:01 UTC 2003 >Closed-Date: >Last-Modified: >Originator: scott snyder >Release: 3.4 20030210 (experimental) >Organization: <organization of PR author (multiple lines)> >Environment: System: Linux karma 2.4.19-emp_2419p5a829i #1 Tue Sep 3 17:42:17 EST 2002 i686 unknown Architecture: i686 <machine, os, target, libraries (multiple lines)> host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: ../gcc/configure --prefix=/usr/local/gcc --enable-threads=posix --enable-long-long >Description: gcc generates bad code in the function bar() below for the passing of the structure to foo(). (Amusingly, the problem shows up only with optimization off and goes away with optimization on --- but only because foo() gets inlined with optimization on.) I expect the program to print `4 5 6'. Here is what it actually prints for me: $ g++ -o x x.cc $ ./x 1073820864 1073824136 1073824548 $ Here is code generated for the bar() function (with labels unused here removed for readability): _Z3barR1B: pushl %ebp movl %esp, %ebp pushl %edi pushl %esi pushl %ebx subl $156, %esp movl 8(%ebp), %eax movl %esp, %ecx movl %eax, %edx movl $144, %eax movl 8(%esp), %esi movl %eax, 8(%esp) movl 4(%esp), %edi movl %edx, 4(%esp) movl (%esp), %ebx movl %ecx, (%esp) call memcpy movl %esi, 8(%esp) movl %edi, 4(%esp) movl %ebx, (%esp) call _Z3foo1B addl $156, %esp popl %ebx popl %esi popl %edi popl %ebp ret It looks like the generated code properly copies the structure to be passed into the stack, but it then overwrites the first three words (immediately after the memcpy call). I do not see this failure in the 3.3 branch. I also do not see the failure if i adjust the source to be valid C code and use gcc instead of g++. >How-To-Repeat: ----------------------------------- extern "C" int printf(...); extern "C" void memset(...); struct B { int f[36]; }; void foo (B b) {printf ("%d %d %d\n", b.f[0], b.f[1], b.f[2]);} void bar (B& b) { foo (b); } int main () { B b; memset (&b.f, 0, sizeof (B)); b.f[0] = 4; b.f[1] = 5; b.f[2] = 6; bar(b); return 0; } ----------------------------------- >Fix: <how to correct or work around the problem, if known (multiple lines)> >Release-Note: >Audit-Trail: >Unformatted:
next reply other threads:[~2003-02-17 15:06 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2003-02-17 15:06 snyder [this message] 2003-02-17 23:46 Alan Modra 2003-02-18 5:06 snyder
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=200302162234.QAA19603@d0mino.fnal.gov \ --to=snyder@fnal.gov \ --cc=gcc-gnats@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).