public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) @ 2010-06-14 15:52 wesley at terpstra dot ca 2010-06-14 15:54 ` [Bug c/44537] " wesley at terpstra dot ca ` (4 more replies) 0 siblings, 5 replies; 6+ messages in thread From: wesley at terpstra dot ca @ 2010-06-14 15:52 UTC (permalink / raw) To: gcc-bugs The assembler instructions gcc generates for a 'goto' statement only respect the low 16 bits of the destination address by default (or in when using PIC in general). This causes the program to jump to the wrong location and soon thereafter segfault. The -mno-explicit-relocs seems to work around this problem, but is no solution for a PIC compilation. This problem appears in both: Using built-in specs. Target: mips-unknown-linux-gnu Configured with: ../gcc/configure --prefix=/home/terpstra/gcc.bin --enable-languages=c Thread model: posix gcc version 4.4.4 (GCC) and: Using built-in specs. Target: mips-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.4-3' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --disable-libssp --enable-targets=all --enable-checking=release --build=mips-linux-gnu --host=mips-linux-gnu --target=mips-linux-gnu Thread model: posix gcc version 4.4.4 (Debian 4.4.4-3) However, I've been having related problems since as far back as gcc-3.4 (at least). The gcc-snapshot in debian also does not resolve this issue. Sometimes different compiler versions and/or optimization flags cause compilation to succeed. I presume this is because the jump offsets fit into 16 bits with different optimization choices. I've seen a related problem where gcc -fPIC creates invalid assembler that with 'branch out of range' .s files. However, first I'll see if this bug being fixed resolves the other. I've included an example C program which can produce the buggy assembler. Compile with: <gcc> -std=gnu99 -O0 -fno-common -fno-strict-aliasing -fomit-frame-pointer -w -S mlyacc.6.preprocessed-nolines.c -g -o bug.s The problem assembler comes from the goto on line 2928: goto leaveChunk; ... when tracing with gdb execution should resume on line 33861, however it instead jumps to line 2749: Inspecting the generated assembler: .loc 1 2928 0 .set noat lw $1,%got($L894)($28) nop addiu $1,$1,%lo($L894) jr $1 ... it is easy to see that the correct label (L894) is used as destination. However, only the low 16 bits of the address are used. When compiled with -mno-explicit-relocs, the assembler reads as: .loc 1 2928 0 .set noat la $1,$L894 # jr $1 ... which works. Modifying the -mexplicit-relocs version (gcc default) to use 'la' instead of the PIC %got results in correct program execution. -- Summary: gcc produces bad MIPS jumps (in large C files) Product: gcc Version: 4.4.4 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: wesley at terpstra dot ca GCC build triplet: mips-unknown-linux-gnu GCC host triplet: mips-unknown-linux-gnu GCC target triplet: mips-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44537 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c/44537] gcc produces bad MIPS jumps (in large C files) 2010-06-14 15:52 [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) wesley at terpstra dot ca @ 2010-06-14 15:54 ` wesley at terpstra dot ca 2010-06-14 16:34 ` [Bug target/44537] " pinskia at gcc dot gnu dot org ` (3 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: wesley at terpstra dot ca @ 2010-06-14 15:54 UTC (permalink / raw) To: gcc-bugs ------- Comment #1 from wesley at terpstra dot ca 2010-06-14 15:53 ------- Created an attachment (id=20908) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=20908&action=view) Pre-processed example file with bad branches. Compile as described in the initial bug report. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44537 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/44537] gcc produces bad MIPS jumps (in large C files) 2010-06-14 15:52 [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) wesley at terpstra dot ca 2010-06-14 15:54 ` [Bug c/44537] " wesley at terpstra dot ca @ 2010-06-14 16:34 ` pinskia at gcc dot gnu dot org 2010-06-14 16:41 ` [Bug c/44537] " wesley at terpstra dot ca ` (2 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: pinskia at gcc dot gnu dot org @ 2010-06-14 16:34 UTC (permalink / raw) To: gcc-bugs ------- Comment #2 from pinskia at gcc dot gnu dot org 2010-06-14 16:34 ------- What version of as are you using? Because the assembler does some optimizations/changes the load address and it looks like rather an assembler issue rather than a compiler one. -- pinskia at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Component|c |target http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44537 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c/44537] gcc produces bad MIPS jumps (in large C files) 2010-06-14 15:52 [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) wesley at terpstra dot ca 2010-06-14 15:54 ` [Bug c/44537] " wesley at terpstra dot ca 2010-06-14 16:34 ` [Bug target/44537] " pinskia at gcc dot gnu dot org @ 2010-06-14 16:41 ` wesley at terpstra dot ca 2010-06-14 17:23 ` [Bug target/44537] " wesley at terpstra dot ca 2010-06-14 17:26 ` wesley at terpstra dot ca 4 siblings, 0 replies; 6+ messages in thread From: wesley at terpstra dot ca @ 2010-06-14 16:41 UTC (permalink / raw) To: gcc-bugs ------- Comment #3 from wesley at terpstra dot ca 2010-06-14 16:40 ------- (sid)terpstra@gabrielli:~/mlton/mlton-20100608$ as -v GNU assembler version 2.20.1 (mips-linux-gnu) using BFD version (GNU Binutils for Debian) 2.20.1-system.20100303 ... is the %got($L894) supposed to cover the case where the label is not in the same high 16-bits as the start of the text section? -- wesley at terpstra dot ca changed: What |Removed |Added ---------------------------------------------------------------------------- Component|target |c http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44537 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/44537] gcc produces bad MIPS jumps (in large C files) 2010-06-14 15:52 [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) wesley at terpstra dot ca ` (2 preceding siblings ...) 2010-06-14 16:41 ` [Bug c/44537] " wesley at terpstra dot ca @ 2010-06-14 17:23 ` wesley at terpstra dot ca 2010-06-14 17:26 ` wesley at terpstra dot ca 4 siblings, 0 replies; 6+ messages in thread From: wesley at terpstra dot ca @ 2010-06-14 17:23 UTC (permalink / raw) To: gcc-bugs ------- Comment #4 from wesley at terpstra dot ca 2010-06-14 17:22 ------- Created an attachment (id=20909) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=20909&action=view) Libraries needed to demonstrate the problem in a linked program To be able to run the complete program: gcc -std=gnu99 -mno-explicit-relocs -O0 -g -w -fno-strict-aliasing mlyacc.6.preprocessed-nolines.c link.a -lgmp -lm -o mlyacc.good gcc -std=gnu99 -O0 -g -w -fno-strict-aliasing mlyacc.6.preprocessed-nolines.c link.a -lgmp -lm -o mlyacc.bad ... you need gmp 4.3.x to link it (which I imagine all gcc developers have). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44537 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/44537] gcc produces bad MIPS jumps (in large C files) 2010-06-14 15:52 [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) wesley at terpstra dot ca ` (3 preceding siblings ...) 2010-06-14 17:23 ` [Bug target/44537] " wesley at terpstra dot ca @ 2010-06-14 17:26 ` wesley at terpstra dot ca 4 siblings, 0 replies; 6+ messages in thread From: wesley at terpstra dot ca @ 2010-06-14 17:26 UTC (permalink / raw) To: gcc-bugs ------- Comment #5 from wesley at terpstra dot ca 2010-06-14 17:25 ------- In case it is a binutils problem, I've attached a '.a' file sufficient to fully link the program. To get to the problem jump is pretty easy: gdb ./mlyacc.bad break Chunk6 run s <hold-down enter> OUTPUT: 2926 nextFun = 2736; (gdb) 2928 goto leaveChunk; (gdb) Program received signal SIGSEGV, Segmentation fault. 0x2aaad880 in ?? () from /lib/ld.so.1 ./mlyacc.good says: too many files Usage: mlyacc.good file.grm (of course it does a lot more if provided a .grm file) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44537 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-06-14 17:26 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-06-14 15:52 [Bug c/44537] New: gcc produces bad MIPS jumps (in large C files) wesley at terpstra dot ca 2010-06-14 15:54 ` [Bug c/44537] " wesley at terpstra dot ca 2010-06-14 16:34 ` [Bug target/44537] " pinskia at gcc dot gnu dot org 2010-06-14 16:41 ` [Bug c/44537] " wesley at terpstra dot ca 2010-06-14 17:23 ` [Bug target/44537] " wesley at terpstra dot ca 2010-06-14 17:26 ` wesley at terpstra dot ca
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).