Opened 4 years ago

Closed 3 years ago

#4599 closed defect (needs_more_info)

failure to build with LLVM on OpenBSD / i386

Reported by: brad Owned by:
Priority: normal Component: postproc
Version: git-master Keywords:
Cc: michael 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 Changed 4 years ago by cehoyos

Please provide your configure line and please test current FFmpeg git head.

comment:2 Changed 4 years ago by brad

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 Changed 4 years ago by cehoyos

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 Changed 4 years ago by cehoyos

  • Version changed from 2.6.3 to git-master

comment:5 Changed 4 years ago by cehoyos

Possibly related to ticket #4474 - does compilation of libavfilter/x86/vf_noise.o succeed?

comment:6 Changed 4 years ago by brad

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:7 Changed 4 years ago by brad

libavfilter/x86/vf_noise.o builds Ok.

comment:8 Changed 4 years ago by brad

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.

Last edited 4 years ago by brad (previous) (diff)

comment:9 Changed 4 years ago by cehoyos

Did you test if the issue is reproducible with a19bcf4e?

comment:10 follow-up: Changed 4 years ago by 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.

comment:11 Changed 4 years ago by michael

clang-3.5 works fine on linux building x86 32bit shared libs, with both EBX and EBP enabled

comment:12 Changed 4 years ago by michael

  • Cc michael 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 Changed 4 years ago by brad

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 in reply to: ↑ 10 Changed 4 years ago by cehoyos

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 Changed 4 years ago by brad

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 Changed 4 years ago by michael

comment:17 Changed 3 years ago by michael

  • Resolution set to needs_more_info
  • Status changed from new to 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

Note: See TracTickets for help on using tickets.