[FFmpeg-trac] #7796(build system:new): Android x86: "error: inline assembly requires more registers than available" when running make
FFmpeg
trac at avcodec.org
Thu Mar 14 17:26:21 EET 2019
#7796: Android x86: "error: inline assembly requires more registers than
available" when running make
-------------------------------------+-------------------------------------
Reporter: ESt | Type: defect
Status: new | Priority: normal
Component: build | Version: git-
system | master
Keywords: android, | Blocked By:
x86, registers |
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
When compiling for android x86 with the following command:
{{{
./configure --cross-prefix=/home/es/Android/Sdk/ndk-
bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-
--cc=/home/es/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-
x86_64/bin/i686-linux-android21-clang --arch=x86 --target-os=android
--prefix=android/x86 \
&& make
}}}
I'm getting the following errors:
{{{
CC libavcodec/h264_parser.o
CC libavcodec/h264_picture.o
CC libavcodec/h264_ps.o
CC libavcodec/h264_redundant_pps_bsf.o
In file included from libavcodec/h264_cabac.c:37:
In file included from libavcodec/cabac_functions.h:46:
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1",
^
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9CC libavcodec/h264_refs.o
: note: expanded from macro 'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
error: register allocation failed: maximum depth for recoloring reached.
Use -fexhaustive-register-search to skip cutoffs
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
error: register allocation failed: maximum depth for recoloring reached.
Use -fexhaustive-register-search to skip cutoffs
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
libavcodec/x86/cabac.h:193:9: error: inline assembly requires more
registers than available
libavcodec/x86/cabac.h:143:9: note: expanded from macro
'BRANCHLESS_GET_CABAC'
"movzbl "statep" , "ret"
\n\t"\
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
clang: error: clang frontend command failed with exit code 70 (use -v to
see invocation)
Android (5058415 based on r339409) clang version 8.0.2
(https://android.googlesource.com/toolchain/clang
40173bab62ec746213857d083c0e8b0abb568790)
(https://android.googlesource.com/toolchain/llvm
7a6618d69e7e8111e1d49dc9e7813767c5ca756a) (based on LLVM 8.0.2svn)
Target: i686-unknown-linux-android21
Thread model: posix
InstalledDir: /home/es/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt
/linux-x86_64/bin
clang: note: diagnostic msg: PLEASE submit a bug report to
https://bugs.llvm.org/ and include the crash backtrace, preprocessed
source, and associated run script.
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/h264_cabac-692ca8.c
clang: note: diagnostic msg: /tmp/h264_cabac-692ca8.sh
clang: note: diagnostic msg:
********************
make: *** [ffbuild/common.mak:60: libavcodec/h264_cabac.o] Error 70
make: *** Waiting for unfinished jobs....
}}}
Digging a bit into 'libavcodec/x86/cabac.h' I found that there's a macro
named 'HAVE_7REGS' which is defined at libavutil/x86/asm.h:75:
{{{
#define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE &&
HAVE_EBP_AVAILABLE))
}}}
And is set to true, since HAVE_EBX_AVAILABLE & HAVE_EBP_AVAILABLE are both
set to true by the configuration file:
{{{
install prefix android/x86
source path .
C compiler /home/es/Android/Sdk/ndk-
bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-
android21-clang
C library bionic
host C compiler gcc
host C library glibc
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 pthreads
safe bitstream reader yes
texi2html enabled no
perl enabled yes
pod2man enabled yes
makeinfo enabled yes
makeinfo supports HTML yes
}}}
Here's some additional output from the config.log file:
{{{
check_inline_asm ebx_available ""::"b"(0)
test_cc
BEGIN /tmp/ffconf.7dLsRDsC/test.c
1 void foo(void){ __asm__ volatile(""::"b"(0)); }
END /tmp/ffconf.7dLsRDsC/test.c
/home/es/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-
x86_64/bin/i686-linux-android21-clang -D_ISOC99_SOURCE
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -DPIC
-std=c11 -fPIE -fomit-frame-pointer -fPIC -c -o
/tmp/ffconf.7dLsRDsC/test.o /tmp/ffconf.7dLsRDsC/test.c
check_inline_asm ebx_available "":::"%ebx"
test_cc
BEGIN /tmp/ffconf.7dLsRDsC/test.c
1 void foo(void){ __asm__ volatile("":::"%ebx"); }
END /tmp/ffconf.7dLsRDsC/test.c
/home/es/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-
x86_64/bin/i686-linux-android21-clang -D_ISOC99_SOURCE
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -DPIC
-std=c11 -fPIE -fomit-frame-pointer -fPIC -c -o
/tmp/ffconf.7dLsRDsC/test.o /tmp/ffconf.7dLsRDsC/test.c
}}}
When I set the definition of HAVE_7REGS to the following, it compiles with
no problem:
{{{
#define HAVE_7REGS (ARCH_X86_64)
}}}
So I'm not sure if it's the EBX or EBP tests that are wrong, the
definition of the HAVE_7REGS, my configuration or the clang compiler.
How to reproduce:
{{{
./configure --cross-prefix=/home/es/Android/Sdk/ndk-
bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-
--cc=/home/es/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-
x86_64/bin/i686-linux-android21-clang --arch=x86 --target-os=android
--prefix=android/x86 \
&& make
#built on Arch-Linux, NDK r19b
}}}
I'm attaching the config.log and the /tmp/h264_cabac-692ca8.sh and /tmp
/h264_cabac-692ca8.c below
--
Ticket URL: <https://trac.ffmpeg.org/ticket/7796>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list