[FFmpeg-trac] #8903(build system:new): mingw-w64 clang i686 "inline assembly requires more registers than available"

FFmpeg trac at avcodec.org
Mon Sep 21 18:05:36 EEST 2020


#8903: mingw-w64 clang i686 "inline assembly requires more registers than
available"
-------------------------------------+-------------------------------------
             Reporter:  1480c1       |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:  build        |                  Version:  git-
  system                             |  master
             Keywords:  windows,     |               Blocked By:
  clang, 32-bit                      |
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Summary of the bug:

 On windows with a mingw-w64 clang targeting i686 obtained through msys2's
 pacman by installing the "mingw32/mingw-w64-i686-clang" version 10.0.1-1
 package, trying to compile "libavcodec/hevc_cabac.o" will result in

 {{{
 CC      libavcodec/hevc_cabac.o
 D:/mabs/build/test-ffmpeg/libavcodec/hevc_cabac.c:37:21: warning: variable
 'num_bins_in_se' is not needed and will not be emitted [-Wunneeded-
 internal-declaration]
 static const int8_t num_bins_in_se[] = {
                     ^
 In file included from D:/mabs/build/test-
 ffmpeg/libavcodec/hevc_cabac.c:27:
 In file included from D:/mabs/build/test-
 ffmpeg/libavcodec/cabac_functions.h:46:
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
         BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1",
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:193:9: error: inline
 assembly requires more registers than available
 D:/mabs/build/test-ffmpeg/libavcodec/x86/cabac.h:143:9: note: expanded
 from macro 'BRANCHLESS_GET_CABAC'
         "movzbl "statep"    , "ret"
 \n\t"\
         ^
 1 warning and 11 errors generated.
 make: *** [/build/test-ffmpeg/ffbuild/common.mak:67:
 libavcodec/hevc_cabac.o] Error 1
 }}}

 the error message itself looks pretty much exactly like
 https://trac.ffmpeg.org/ticket/7796, but since that one seems to
 specifically be tracking android x86 and I haven't gotten a response on if
 I should append to that or create a new issue, I decided to make new
 issue.

 The commit I have tested this on is
 https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/e71d73b09652f4fc96e512a7d6d4c2ab41860f27

 head part of configure output

 {{{
 install prefix            /usr/local
 source path               /home/user/test-ffmpeg
 C compiler                clang
 C library                 mingw64
 ARCH                      x86 (generic)
 big-endian                no
 runtime cpu detection     yes
 standalone assembly       yes
 x86 assembler             nasm
 MMX enabled               yes
 MMXEXT enabled            yes
 3DNow! enabled            yes
 3DNow! extended enabled   yes
 SSE enabled               yes
 SSSE3 enabled             yes
 AESNI enabled             yes
 AVX enabled               yes
 AVX2 enabled              yes
 AVX-512 enabled           yes
 XOP enabled               yes
 FMA3 enabled              yes
 FMA4 enabled              yes
 i686 features enabled     yes
 CMOV is fast              no
 EBX available             yes
 EBP available             yes
 debug symbols             yes
 strip symbols             yes
 optimize for size         no
 optimizations             yes
 static                    yes
 shared                    no
 postprocessing support    no
 network support           yes
 threading support         w32threads
 safe bitstream reader     yes
 texi2html enabled         no
 perl enabled              yes
 pod2man enabled           yes
 makeinfo enabled          yes
 makeinfo supports HTML    yes
 }}}

 I can attach the ffbuild/config.log if requested

 How to reproduce:

 1. on a Windows machine or VM, download msys2, then run inside msys2.exe
 {{{
 pacman -Syu --noconfirm
 pacman -Suu --noconfirm
 # clang and its deps are quite huge already, 2.5 GiB installed size as
 reported by pacman
 pacman -S --needed --noconfirm mingw-w64-i686-clang git base-devel
 }}}

 2. Then, run the following inside mingw32.exe
 {{{
 git clone --branch master https://github.com/FFmpeg/FFmpeg.git test-ffmpeg
 mkdir test-ffmpeg/clang-build && cd test-ffmpeg/clang-build
 ../configure --cc="clang" --cxx="clang++"
 make libavcodec/hevc_cabac.o
 }}}

 the clang line from make V=1
 {{{
 clang -I. -I/home/cddeg/test-ffmpeg/ -D_ISOC99_SOURCE
 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -U__STRICT_ANSI__
 -D__USE_MINGW_ANSI_STDIO=1 -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
 -DZLIB_CONST -DHAVE_AV_CONFIG_H -DBUILDING_avcodec -std=c11 -fomit-frame-
 pointer -I/mingw32/include -g -Wdeclaration-after-statement -Wall
 -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings
 -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast
 -Wstrict-prototypes -Wempty-body -Wno-parentheses -Wno-switch -Wno-format-
 zero-length -Wno-pointer-sign -Wno-unused-const-variable -Wno-bool-
 operation -Wno-char-subscripts -O3 -fno-math-errno -fno-signed-zeros
 -Qunused-arguments -Werror=implicit-function-declaration -Werror=missing-
 prototypes -Werror=return-type   -MMD -MF libavcodec/hevc_cabac.d -MT
 libavcodec/hevc_cabac.o -c -o libavcodec/hevc_cabac.o /home/cddeg/test-
 ffmpeg/libavcodec/hevc_cabac.c
 }}}


 I am not sure how to try to reproduce this on a Linux machine with a clang
 cross compiler as I do not have any experience doing cross-compilation and
 trying to use mstorsjo/llvm-mingw resulted in a failure on my part to
 understand how to use it, and it doesn't seem like there's an easy to
 follow guide for cross-compiling ffmpeg with clang.

 Attempting to use the post-processed source file using `-E -P` with both
 32-bit gcc and clang results in gcc compiling successfully, but clang
 failing.
 I've tried extracting the "get_cabac_inline_x86" function and the
 necessary components needed to compile it, along with making it non-static
 and non-inline and compiling just that function with clang and gcc, but in
 the isolated function case, both clang and gcc compile the source file
 without error and I see the assembly in the disassembly of the object
 file, which makes me guess it might be related to inlining, etc, but I am
 not a compiler expert.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/8903>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list