Package: gcc-5 Version: 5.3.1-7 Severity: serious Justification: causes ffmpeg to FTBFS Control: affects -1 ffmpeg X-Debbugs-Cc: debian-m...@lists.debian.org
Dear Maintainer, ffmpeg 7:2.8.6-1 failed to build on mips due to test failures. I investigated the problem and it turns out to be caused by a compiler bug that can be avoided by using '-fno-expensive-optimizations'. (Somehow this feels like Déjà vu... #800318) Attached is a reduced test case: $ ls Makefile main.c test.c $ make cc -fPIC -g -O2 -fno-expensive-optimizations -c -o working.o test.c cc -shared -o libworking.so working.o cc -fPIC -g -o working main.c -L. -lworking cc -fPIC -g -O2 -c -o broken.o test.c cc -shared -o libbroken.so broken.o cc -fPIC -g -o broken main.c -L. -lbroken LD_LIBRARY_PATH=. ./working || true chunk_size: 11760 working LD_LIBRARY_PATH=. ./broken || true chunk_size: 0 broken This works correctly with gcc-5 5.3.1-6, so it is a regression in 5.3.1-7. The difference between broken.o compiled by 5.3.1-6 and 5.3.1-7 is shown by diffoscope as: ├── objdump --line-numbers --disassemble --section=.text {} │ @@ -17,23 +17,23 @@ │ 18: 24420001 addiu v0,v0,1 │ 1c: 24630001 addiu v1,v1,1 │ 20: aca2000c sw v0,12(a1) │ ./test.c:28 (discriminator 3) │ 24: 1446fffb bne v0,a2,14 <roq_read_packet+0x14> │ 28: a064ffff sb a0,-1(v1) │ ./test.c:32 │ - 2c: 8ba4000a lwl a0,10(sp) │ - 30: 97a2000c lhu v0,12(sp) │ - 34: 9ba4000d lwr a0,13(sp) │ - 38: 7c0210a0 wsbh v0,v0 │ + 2c: 8ba3000a lwl v1,10(sp) │ + 30: 97a4000c lhu a0,12(sp) │ + 34: 9ba3000d lwr v1,13(sp) │ + 38: 7c0420a0 wsbh a0,a0 │ ./test.c:33 │ 3c: 27bd0010 addiu sp,sp,16 │ ./test.c:32 │ - 40: 00021c00 sll v1,v0,0x10 │ - 44: 00041202 srl v0,a0,0x8 │ - 48: 00042602 srl a0,a0,0x18 │ - 4c: 3042ff00 andi v0,v0,0xff00 │ - 50: 00621025 or v0,v1,v0 │ + 40: 3084ffff andi a0,a0,0xffff │ + 44: 00031200 sll v0,v1,0x8 │ + 48: 7c633a00 ext v1,v1,0x8,0x8 │ + 4c: 00431825 or v1,v0,v1 │ + 50: 00031400 sll v0,v1,0x10 │ ./test.c:33 │ 54: 03e00008 jr ra │ 58: 00441025 or v0,v0,a0 │ 5c: 00000000 nop ├── readelf --wide --decompress --string-dump=.comment {} │ @@ -1,4 +1,4 @@ │ │ String dump of section '.comment': │ - [ 1] GCC: (Debian 5.3.1-6) 5.3.1 20160114 │ + [ 1] GCC: (Debian 5.3.1-7) 5.3.1 20160121 │ ╵ I hope that helps to fix this bug soon. Best regards, Andreas -- System Information: Debian Release: stretch/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: mips Kernel: Linux 4.3.0-1-amd64 (SMP w/4 CPU cores) Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) (ignored: LC_ALL set to C) Shell: /bin/sh linked to /bin/dash Init: unable to detect Versions of packages gcc-5 depends on: ii binutils 2.26-3 ii cpp-5 5.3.1-7 ii gcc-5-base 5.3.1-7 ii libc6 2.21-7 ii libcc1-0 5.3.1-7 ii libgcc-5-dev 5.3.1-7 ii libgcc1 1:5.3.1-7 ii libgmp10 2:6.1.0+dfsg-2 ii libisl15 0.16.1-1 ii libmpc3 1.0.3-1 ii libmpfr4 3.1.3-2 ii libstdc++6 5.3.1-7 ii zlib1g 1:1.2.8.dfsg-2+b1 Versions of packages gcc-5 recommends: ii libc6-dev 2.21-7 Versions of packages gcc-5 suggests: pn gcc-5-doc <none> pn gcc-5-locales <none> pn gcc-5-multilib <none> pn libasan2-dbg <none> pn libatomic1-dbg <none> pn libcilkrts5-dbg <none> pn libgcc1-dbg <none> pn libgomp1-dbg <none> pn libitm1-dbg <none> pn liblsan0-dbg <none> pn libmpx0-dbg <none> pn libquadmath0-dbg <none> pn libtsan0-dbg <none> pn libubsan0-dbg <none> -- no debconf information
#include <inttypes.h> #include <stdio.h> typedef struct AVIOContext { uint8_t a[4]; uint8_t *buffer; int32_t buffer_size; uint8_t *buf_ptr; } AVIOContext; typedef struct AVFormatContext { uint8_t a[15]; AVIOContext* pb; } AVFormatContext; typedef struct AVPacket { void *a; } AVPacket; int roq_read_packet(AVFormatContext *s, AVPacket *pkt); int main() { AVPacket pkt = { 0 }; AVFormatContext s = { 0 }; AVIOContext pb = { 0 }; uint8_t buffer[32768] = { 0x84, 0x10, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x21, 0x10, 0xf0, 0x2d, 0x00, 0x00, 0x00, 0x00, 0 }; pb.buffer = buffer; pb.buffer_size = 32768; pb.buf_ptr = &buffer[8]; s.pb = &pb; int chunk_size = roq_read_packet(&s, &pkt); printf("chunk_size: %u\n", chunk_size); if (chunk_size == 0x2df0) { printf("working\n"); return 0; } else { printf("broken\n"); return 1; } }
CFLAGS += -fPIC -g LDFLAGS += -shared all: working broken LD_LIBRARY_PATH=. ./working || true LD_LIBRARY_PATH=. ./broken || true working.o: $(CC) $(CFLAGS) -O2 -fno-expensive-optimizations -c -o working.o test.c broken.o: $(CC) $(CFLAGS) -O2 -c -o broken.o test.c libworking.so: working.o $(CC) $(LDFLAGS) -o libworking.so working.o libbroken.so: broken.o $(CC) $(LDFLAGS) -o libbroken.so broken.o working: libworking.so $(CC) $(CFLAGS) -o working main.c -L. -lworking broken: libbroken.so $(CC) $(CFLAGS) -o broken main.c -L. -lbroken clean: rm -f working.o libworking.so working broken.o libbroken.so broken
#include <inttypes.h> typedef struct AVIOContext { uint8_t a[4]; uint8_t *buffer; int32_t buffer_size; uint8_t *buf_ptr; } AVIOContext; typedef struct AVFormatContext { uint8_t a[15]; AVIOContext* pb; } AVFormatContext; typedef struct AVPacket { void *a; } AVPacket; static uint32_t av_bswap32(uint32_t x) { return ((((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) << 16 | ((((x) >> 16) << 8 & 0xff00) | (((x) >> 16) >> 8 & 0x00ff))); } int roq_read_packet(AVFormatContext *s, AVPacket *pkt) { unsigned char preamble[8]; int i; for (i = 0; i < 8; i += 1) { preamble[i] = s->pb->buf_ptr[0]; s->pb->buf_ptr += 1; } return av_bswap32(*((uint32_t *) (&preamble[2]))); }