Opened 9 years ago
Closed 9 years ago
#4599 closed defect (needs_more_info)
failure to build with LLVM on OpenBSD / i386
Reported by: | Brad Smith | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | postproc |
Version: | git-master | Keywords: | |
Cc: | Michael Niedermayer | Blocked By: | |
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
Trying to build FFmpeg 2.6.2 on OpenBSD / i386 with LLVM 3.5 fails like so...
cc -I. -I./ -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DPIC -DZLIB_CONST -DHAVE_AV_CONFIG_H -O2 -pipe -I/usr/local/include -I/usr/X11R6/include -std=c99 -fomit-frame-pointer -fPIC -pthread -I/usr/local/include -I/ usr/X11R6/include -I/usr/X11R6/include/freetype2 -I/usr/include -I/usr/local/include/fribidi -I/usr/X11R6/include -I/usr/X11R6/include/freetype2 -I/usr/include -I/usr/X11R6/include/freetype2 -I/usr/local/include -I/usr/local/include /fribidi -I/usr/local/include/opus -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/X11R6/include -DXTHREADS -I/usr/X11R6/include -I/usr/X11R6/include -I/usr /X11R6/include -I/usr/X11R6/include -Wdeclaration-after-statement -Wall -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototype s -Wempty-body -Wno-parentheses -Wno-switch -Wno-format-zero-length -Wno-pointer-sign -O2 -pipe -Wno-redundant-decls -fno-math-errno -fno-signed-zeros -Qunused-arguments -Werror=implicit-function-declaration -Werror=missing-prototyp es -Werror=return-type -MMD -MF libpostproc/postprocess.d -MT libpostproc/postprocess.o -c -o libpostproc/postprocess.o libpostproc/postprocess.c libpostproc/postprocess.c:173:20: warning: unused function 'prefetchnta' [-Wunused-function] static inline void prefetchnta(const void *p) ^ libpostproc/postprocess.c:180:20: warning: unused function 'prefetcht0' [-Wunused-function] static inline void prefetcht0(const void *p) ^ libpostproc/postprocess.c:187:20: warning: unused function 'prefetcht1' [-Wunused-function] static inline void prefetcht1(const void *p) ^ libpostproc/postprocess.c:194:20: warning: unused function 'prefetcht2' [-Wunused-function] static inline void prefetcht2(const void *p) ^ In file included from libpostproc/postprocess.c:575: libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available "lea (%0, %1), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:3517:17: error: inline assembly requires more registers than available "mov %4, %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3381:17: error: inline assembly requires more registers than available "mov %4, %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ libpostproc/postprocess_template.c:3185:9: error: inline assembly requires more registers than available "lea (%0,%2), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ libpostproc/postprocess_template.c:3185:9: error: inline assembly requires more registers than available "lea (%0,%2), %%"REG_a" \n\t" ^ In file included from libpostproc/postprocess.c:571: libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available "lea (%0, %1), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:3517:17: error: inline assembly requires more registers than available "mov %4, %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3381:17: error: inline assembly requires more registers than available "mov %4, %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ libpostproc/postprocess_template.c:3185:9: error: inline assembly requires more registers than available "lea (%0,%2), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 4 warnings and 20 errors generated.
Change History (17)
comment:1 by , 9 years ago
comment:2 by , 9 years ago
The configure args used are..
--enable-libx265 --enable-shared --arch=i386 --cc=clang --disable-altivec --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-debug --disable-iconv --disable-indev=jack --disable-indev=oss --disable-lzma --disable-mipsdspr1 --disable-mipsdspr2 --disable-neon --disable-outdev=oss --disable-outdev=sdl --disable-vfp --enable-avresample --enable-fontconfig --enable-gpl --enable-libass --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-libopus --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --extra-cflags="-I/usr/local/include -I/usr/X11R6/include" --extra-libs="-L/usr/local/lib -L/usr/X11R6/lib" --mandir=/usr/local/man --optflags="-O2 -pipe -Wno-redundant-decls"
A build from latest source..
$ gmake CC libpostproc/postprocess.o In file included from libpostproc/postprocess.c:544: libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available "lea (%0, %1), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available libpostproc/postprocess_template.c:3185:9: error: inline assembly requires more registers than available "lea (%0,%2), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ libpostproc/postprocess_template.c:3185:9: error: inline assembly requires more registers than available "lea (%0,%2), %%"REG_a" \n\t" ^ In file included from libpostproc/postprocess.c:540: libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available "lea (%0, %1), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:1674:9: error: inline assembly requires more registers than available libpostproc/postprocess_template.c:3185:9: error: inline assembly requires more registers than available "lea (%0,%2), %%"REG_a" \n\t" ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^ libpostproc/postprocess_template.c:2169:9: error: inline assembly requires more registers than available "lea (%2, %2, 2), %%"REG_a" \n\t" // 3*stride ^ libpostproc/postprocess_template.c:3102:9: error: inline assembly requires more registers than available "movq (%%"REG_a"), %%mm2 \n\t" // packedYOffset ^
comment:3 by , 9 years ago
Does the following succeed compilation (is this the only issue)?
$ ./configure --enable-gpl --cc=clang --disable-postproc && make
And please confirm (no need to post output again) that the following fails:
$ ./configure --enable-gpl --cc=clang && make libpostproc/postprocess.o
Is your problem also reproducible with version a19bcf4e?
comment:4 by , 9 years ago
Version: | 2.6.3 → git-master |
---|
comment:5 by , 9 years ago
Possibly related to ticket #4474 - does compilation of libavfilter/x86/vf_noise.o succeed?
comment:6 by , 9 years ago
No, this is not the only issue. There was one or two other files that did not build.
With libpostproc disabled the build completes. With libpostproc enabled and just building that one object it fails.
It looks like a19bcf4e was commited quite some time ago and is included with 2.3 or newer so it is included with 2.6.x.
comment:8 by , 9 years ago
Hrmm. I was wrong when I said there were other files. I was almost certain there was but checking back with my ports build I don't see any other files failing to build other than the libpostproc code.
follow-up: 14 comment:10 by , 9 years ago
After looking at ticket #4474 I compared the detected availability of EBP / EBX with the system GCC 4.2.1 vs LLVM I see that EBX is no for GCC and yes for LLVM.
If I disable EBX after configure runs with LLVM then libpostproc builds.
comment:11 by , 9 years ago
clang-3.5 works fine on linux building x86 32bit shared libs, with both EBX and EBP enabled
comment:12 by , 9 years ago
Cc: | added |
---|
maybe something like this would workaround this compiler issue:
could you test and amend if it doesnt work?
diff --git a/configure b/configure index 1cd9fd6..82cde9d 100755 --- a/configure +++ b/configure @@ -5597,6 +5597,7 @@ elif enabled clang; then check_cflags -Werror=implicit-function-declaration check_cflags -Werror=missing-prototypes check_cflags -Werror=return-type + enabled x86_32 && enabled shared && [ $target_os == openbsd ] && disable ebx_available elif enabled cparser; then add_cflags -Wno-missing-variable-declarations add_cflags -Wno-empty-statement
comment:13 by , 9 years ago
Comparing Clang on Linux to OpenBSD is not an apples to apples comparison. OpenBSD uses PIE (everywhere), Linux does not. So the Linux Clang is just not exposing this issue.
comment:14 by , 9 years ago
Replying to brad:
After looking at ticket #4474 I compared the detected availability of EBP / EBX with the system GCC 4.2.1 vs LLVM I see that EBX is no for GCC and yes for LLVM.
If I disable EBX after configure runs with LLVM then libpostproc builds.
Does this mean the current test for EBX availability in configure fails for LLVM on OpenBSD?
comment:15 by , 9 years ago
That is what it sounds like to me. With the system GCC 4.2.1 the EBX test shows no, with LLVM/Clang it shows as yes. I would be willing to test anything you want if you happen to have any ideas.
comment:16 by , 9 years ago
Can you test the patch in https://trac.ffmpeg.org/ticket/4599#comment:12 ?
comment:17 by , 9 years ago
Resolution: | → needs_more_info |
---|---|
Status: | new → closed |
closing this as none of the affected people care enough to reply for 5 months, please reopen if you can test the suggested patch or have a better / different patch
Please provide your configure line and please test current FFmpeg git head.