public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "oneill+gccbugs at cs dot hmc dot edu" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug c/13704] New: Regression: Spurious register saves with setjmp on MIPS (and others?) (crosscompiling) Date: Thu, 15 Jan 2004 22:31:00 -0000 [thread overview] Message-ID: <20040115223101.13704.oneill+gccbugs@cs.hmc.edu> (raw) This bug a regression in 3.2.x and 3.3.x -- it is not in 3.0.x or 3.4 prereleases, but is in 3.2.x and 3.3.x (including 3.3-20040112) -- it would be helpful to see it fixed in the 3.3.x series, since at present it means that 3.3.x cannot be used without patches for some configurations. Consider the following code (setjmp-caller.c), which will be compiled with -mno-abicalls -fno-pic -ffreestanding --- begin file: setjmp-caller.c ------------------ int setjmp(void *); int foo() { setjmp(0); } --- end file: setjmp-caller.c ------------------ With 3.0.4 and 3.4-20040114, we get the following CORRECT assembly output from a cross compiler (built with -nfp), from running: mips-linux-gcc-3.0.4 -mno-abicalls -fno-pic -ffreestanding -S -o setjmp-caller-3.0.4.s setjmp- caller.c mips-linux-gcc-3.4-20040114 -mno-abicalls -fno-pic -ffreestanding -S -o setjmp-caller-3.4 -20040114.s setjmp-caller.c --- begin file: setjmp-caller-3.0.4.s ------------------ .file 1 "setjmp-caller.c" .text .align 2 .globl foo .ent foo .type foo,@function foo: .frame $fp,24,$31 # vars= 0, regs= 2/0, args= 16, extra= 0 .mask 0xc0000000,-4 .fmask 0x00000000,0 subu $sp,$sp,24 sw $31,20($sp) sw $fp,16($sp) move $fp,$sp move $4,$0 jal setjmp move $sp,$fp lw $31,20($sp) lw $fp,16($sp) addu $sp,$sp,24 j $31 .end foo .ident "GCC: (GNU) 3.0.4" --- end file: setjmp-caller-3.0.4.s ------------------ --- begin file: setjmp-caller-3.4-20040114.s ------------------ .file 1 "setjmp-caller.c" .section .mdebug.abi32 .previous .text .align 2 .globl foo .ent foo .type foo, @function foo: .frame $fp,24,$31 # vars= 0, regs= 2/0, args= 16, gp= 0 .mask 0xc0000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-24 sw $31,20($sp) sw $fp,16($sp) move $fp,$sp move $4,$0 jal setjmp nop move $sp,$fp lw $31,20($sp) lw $fp,16($sp) addiu $sp,$sp,24 j $31 nop .set macro .set reorder .end foo .ident "GCC: (GNU) 3.4.0 20040114 (experimental)" --- end file: setjmp-caller-3.4-20040114.s ------------------ With the other versions, we get a number of spurious register saves... For example, with 3.3.2, we get: --- begin file: setjmp-caller-3.3.2.s ------------------ .file 1 "setjmp-caller.c" .section .mdebug.abi32 .previous .text .align 2 .globl foo .ent foo .type foo, @function foo: .frame $fp,104,$31 # vars= 0, regs= 10/6, args= 16, extra= 0 .mask 0xc0ff0000,-52 .fmask 0xfff00000,-8 subu $sp,$sp,104 sw $31,52($sp) sw $fp,48($sp) sw $23,44($sp) sw $22,40($sp) sw $21,36($sp) sw $20,32($sp) sw $19,28($sp) sw $18,24($sp) sw $17,20($sp) sw $16,16($sp) s.d $f30,96($sp) s.d $f28,88($sp) s.d $f26,80($sp) s.d $f24,72($sp) s.d $f22,64($sp) s.d $f20,56($sp) move $fp,$sp move $4,$0 jal setjmp move $sp,$fp lw $31,52($sp) lw $fp,48($sp) lw $23,44($sp) lw $22,40($sp) lw $21,36($sp) lw $20,32($sp) lw $19,28($sp) lw $18,24($sp) lw $17,20($sp) lw $16,16($sp) l.d $f30,96($sp) l.d $f28,88($sp) l.d $f26,80($sp) l.d $f24,72($sp) l.d $f22,64($sp) l.d $f20,56($sp) addu $sp,$sp,104 j $31 .end foo .ident "GCC: (GNU) 3.3.2" --- end file: setjmp-caller-3.3.2.s ------------------ Since the cross compiler was configured with --nfp, this is especially bad, it's emiting floating point instructions for a program that doesn't use fp, on a platform that doesn't support it. I wrote the following bandaid for 3.3.2, but I can't say that it's the right fix, it was just a "make it stop!" solution... --- begin file: gcc-3.3.3-setjmp.patch ------------------ --- gcc-3.3.2+cs161/gcc/reload1.c~ 2003-06-06 22:30:09.000000000 -0700 +++ gcc-3.3.2+cs161/gcc/reload1.c 2004-01-13 21:55:37.000000000 -0800 @@ -760,7 +760,7 @@ && GET_MODE (insn) != VOIDmode) PUT_MODE (insn, VOIDmode); - if (GET_CODE (insn) == CALL_INSN + if (0 && GET_CODE (insn) == CALL_INSN && find_reg_note (insn, REG_SETJMP, NULL)) for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) if (! call_used_regs[i]) --- end file: gcc-3.3.3-setjmp.patch ------------------ Best Regards, M.E. O'Neill. P.S. For what it's worth, in case you want to look into this and you want to know how I built the cross compilers, it was as follows Download binutils-2.14.tar.bz2 gcc-core-3.0.4.tar.gz gcc-core-3.2.3.tar.bz2 gcc-core-3.3-20040112.tar.bz2 gcc-core-3.3.2.tar.bz2 gcc-core-3.4-20040114.tar.bz2 And then, in csh: set target = mips-linux set base = `pwd` set prefix = $base/test-gcc mkdir -p $prefix/bin set path = ($path $prefix/bin) tar xjf binutils-2.14.tar.bz2 mkdir binutils-2.14-build cd binutils-2.14-build ../binutils-2.14/configure --nfp --target $target --prefix $prefix make make install foreach vers (3.2.3 3.3.2 3.3-20040112 3.4-20040114) cd $base if (-e gcc-core-$vers.tar.gz) tar xzf gcc-core-$vers.tar.gz if (-e gcc-core-$vers.tar.bz2) tar xjf gcc-core-$vers.tar.bz2 mkdir -p gcc-$vers-build cd gcc-$vers-build ../gcc-$vers/configure --nfp --disable-shared --disable-threads --target $target --prefix $prefix make make install cd $base mv $prefix/bin/mips-linux-gcc{,-$vers} mv $prefix/bin/mips-linux-cpp{,-$vers} rehash mips-linux-gcc-$vers -mno-abicalls -fno-pic -ffreestanding -S -o setjmp-caller-$vers.s setjmp-caller.c end (note that the 3.4-20040114 build will die [hey, it's a snapshot], but it's easy enough to fix by hand) -- Summary: Regression: Spurious register saves with setjmp on MIPS (and others?) (crosscompiling) Product: gcc Version: 3.3.3 Status: UNCONFIRMED Severity: normal Priority: P1 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: oneill+gccbugs at cs dot hmc dot edu CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: mips-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13704
next reply other threads:[~2004-01-15 22:31 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2004-01-15 22:31 oneill+gccbugs at cs dot hmc dot edu [this message] 2004-01-15 22:40 ` [Bug c/13704] " pinskia at gcc dot gnu dot org 2004-01-15 23:18 ` oneill+gccbugs at cs dot hmc dot edu 2004-01-16 8:40 ` rsandifo at redhat dot com
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=20040115223101.13704.oneill+gccbugs@cs.hmc.edu \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@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).