[FFmpeg-devel] [PATCH v6 1/3] mips: improve detection of ISAs, FPU and ASEs (DSP, MSA)

Vicente Olivert Riera Vincent.Riera at imgtec.com
Wed Jan 20 15:33:21 CET 2016


On 20/01/16 13:15, Michael Niedermayer wrote:
> On Wed, Jan 20, 2016 at 12:21:37PM +0000, Vicente Olivert Riera wrote:
>> On 20/01/16 12:05, Michael Niedermayer wrote:
>>> On Wed, Jan 20, 2016 at 11:37:52AM +0000, Vicente Olivert Riera wrote:
>>>> Hello Michael,
>>>>
>>>> On 19/01/16 22:11, Michael Niedermayer wrote:
>>>>> On Thu, Jan 14, 2016 at 02:59:03PM +0000, Vicente Olivert Riera wrote:
>>>>>> Signed-off-by: Vicente Olivert Riera <Vincent.Riera at imgtec.com>
>>>>>> ---
>>>>>> Changes v5 -> v6:
>>>>>>  - Multiple changes:
>>>>>>    - Use separate if blocks when detecting the MIPS ISA, this way when a block
>>>>>>      disables one ISA it will be detected by the next one. Before the elif was
>>>>>>      preventing this to be done.
>>>>>>    - Don't use check_cflags and use only check_ldflags instead, which will
>>>>>>      check if that flag is valid for compiling and linking. The compiler may
>>>>>>      accept some cflags for compiling but not for linking, so if we check first
>>>>>>      for the cflags it will succeed, and the cflags will be added to the CFLAGS
>>>>>>      variable despite of the check_ldflags failing after that. This can cause
>>>>>>      problems because of having multiple incompatible cflags enabled at the same
>>>>>>      time.
>>>>>>    - Check if mipsfpu has been disabled, and if so, then use -msoft-float. This
>>>>>>      way we override the compiler default behavious which can be building for
>>>>>>      hard-float.
>>>>>>    - Explicitly disable the features that fail any check by adding "|| disable
>>>>>>      $feature" at the end of the checks chain.
>>>>>>
>>>>>> Changes v4 -> v5:
>>>>>>  - Check for msa.h and disable msa if not found.
>>>>>>
>>>>>> Changes v3 -> v4:
>>>>>>  - Nothing.
>>>>>>
>>>>>> Changes v2 -> v3:
>>>>>>  - Nothing.
>>>>>>
>>>>>> Changes v1 -> v2:
>>>>>>  - Add a block of code for mipsdspr2 which was previously placed in the
>>>>>>    first patch of this series causing a syntax error in the configure
>>>>>>    script.
>>>>>>    https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2015-November/183444.html
>>>>>
>>>>> make distclean ; ../configure --cross-prefix=/usr/mips-linux-gnu/bin/ --cc='ccache mips-linux-gnu-gcc-4.4' --arch=mips --target-os=linux --enable-cross-compile  --disable-mipsfpu && make -j12
>>>>> results in pages of:
>>>>>
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libswresample/libswresample.a(dither.o) uses soft float
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libswresample/libswresample.a(resample.o) uses soft float
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libswresample/libswresample.a(resample_dsp.o) uses soft float
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libavutil/libavutil.a(adler32.o) uses soft float
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libavutil/libavutil.a(aes.o) uses soft float
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libavutil/libavutil.a(aes_ctr.o) uses soft float
>>>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: libavfilter/filtfmts-test uses hard float, libavutil/libavutil.a(audio_fifo.o) uses soft float
>>>>>
>>>>>
>>>>> [...]
>>>>>
>>>>
>>>> I can't reproduce your issue. Look:
>>>>
>>>> $ make distclean ; ./configure --cross-prefix=mips-linux-gnu-
>>>> --arch=mips --target-os=linux --enable-cross-compile --disable-mipsfpu
>>>>
>>>> And then:
>>>>
>>>> $ make -j1 V=1 2>&1 | tee build.log
>>>>
>>>> And then:
>>>>
>>>> $ grep "uses soft float" build.log
>>>> $ grep "filtfmts-test" build.log
>>>>
>>>> It gives me nothing.
>>>>
>>>> Also I try to find for that filtfmts-test file which your logs say that
>>>> is using hard-float, and I cannot find it:
>>>>
>>>
>>>> $ find . -name "filtfmts-test*"
>>>> $
>>>
>>> see libavfilter/filtfmts.c
>>
>> But do you have a generated filtfmts-test binary or a filtfmts.o file?
>> Because when my build is finished I don't any anything of that.
> 
> make libavfilter/filtfmts-test
> CC      libavfilter/filtfmts-test.o
> libavfilter/filtfmts.c:141:9: warning: ignoring return value of function declared with warn_unused_result attribute [-Wunused-result]
>         ff_default_query_formats(filter_ctx);
>         ^~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~
> 1 warning generated.
> LD      libavfilter/filtfmts-test
> 
> the source and object files differ in their names
> 

I see. Ok, look at this:

$ make libavfilter/filtfmts-test
CC	libavfilter/filtfmts-test.o
libavfilter/filtfmts.c: In function 'main':
libavfilter/filtfmts.c:141:9: warning: ignoring return value of
'ff_default_query_formats', declared with attribute warn_unused_result
[-Wunused-result]
         ff_default_query_formats(filter_ctx);
         ^
LD	libavfilter/filtfmts-test

$ mips-linux-gnu-objdump -x libavfilter/filtfmts-test | grep "FP ABI"
FP ABI: Soft float

It shows to me that it has been for soft-float.

>>
>>> our compilers differ
>>> the one i have here is a binary from emdebian
>>> are you droping support for that ?
>>> if so that should be clearly stated in the commit message, and  the
>>> compiler cleanly detected and a clear warning given to the user why
>>> his/her compiler isnt supported and what is supported
>>
>> Well, my intention isn't dropping support for anything, although this is
>> what the emdebian website says:
>>
>> "Status of Emdebian distributions
>>
>> As of July 2014, updates to the Emdebian distributions ceased. There
>> will be no further updates and no further stable releases."
> 
> i know, the problem is not me, i can update, IIRC you guys posted a
> binary already
> but others might use similarly build or old compilers
> so keeping this one here gives some wider coverage ... and its less
> work

I also want to keep it.

>>
>> Anyway, how can I obtain the same compiler as you have in order to try
>> reproducing the bug?
> 
> i dont know, if they arent on emdian anymore
> i dont seem to have the deb files in var/cache/apt/archive anymore
> 
> Package: gcc-4.4-mips-linux-gnu
> Status: install ok installed
> Priority: extra
> Section: devel
> Installed-Size: 3088
> Maintainer: Debian GCC Maintainers <debian-gcc at lists.debian.org>
> Architecture: amd64
> Source: gcc-4.4
> Version: 4.4.5-8
> Provides: c-compiler-mips-linux-gnu
> Depends: gcc-4.4-mips-linux-gnu-base (= 4.4.5-8), cpp-4.4-mips-linux-gnu (= 4.4.5-8), binutils-mips-linux-gnu (>= 2.20.1-15~), libgcc1-mips-cross (>= 1:4.4.5-8), libgomp1-mips-cross (>= 4.4.5-8), libc6 (>= 2.11)
> Recommends: libc6-dev-mips-cross (>= 2.5)
> Suggests: gcc-4.4-multilib-mips-linux-gnu, libmudflap0-4.4-dev-mips-cross (>= 4.4.5-8), gcc-4.4-doc (>= 4.4.4-17), gcc-4.4-locales (>= 4.4.4-17), libgcc1-dbg-mips-cross, libgomp1-dbg-mips-cross, libmudflap0-dbg-mips-cross, libcloog-ppl0 (>= 0.15.9-2~), libppl-c2, libppl7
> Description: The GNU C compiler
>  This is the GNU C compiler, a fairly portable optimizing compiler for C.
>  .
>  This package contains C cross-compiler for mips architecture.
> Homepage: http://gcc.gnu.org/
> 

Ok then.

>>
>>> make distclean ; ../configure --cross-prefix=/usr/mips-linux-gnu/bin/ --cc='mips-linux-gnu-gcc-4.4' --arch=mips --target-os=linux --enable-cross-compile  --disable-mipsfpu && make -j12  >& build
>>>
>>> grep 'uses soft float' build | wc
>>> 2327   24879  389225
>>>
>>> echo 'int main(void){ return 0; }' | mips-linux-gnu-gcc-4.4  -x c - -o out.o
>>> echo 'int main(void){ return 0; }' | mips-linux-gnu-gcc-4.4  -x c - -o out.o -msoft-float
>>> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: out.o uses hard float, /tmp/ccFlutMG.o uses soft float
>>>
>>>
>>
>> But I don't understand how your compiler built something for hard-float
>> when the -msoft-float option should be used instead. This is what I have
>> (note that I passed V=1 to the make command):
>>
>> $ grep '\-mhard-float' build.log | wc -l
>> 0
>> $ grep '\-msoft-float' build.log | wc -l
>> 1411
>> $ grep "mips-linux-gnu-gcc" build.log | wc -l
>> 1411
>>
>> So the -mhard-float option wasn't used at all, and the -msoft-float one
>> was used every time the compiler was called.
>>
>> I'm curious, can you show me your output for those same commands, please?
> 
> before the patch:
> grep '\-mhard-float' build.log-V1-disable-mipsfpu | wc -l
> 0
> 
> grep '\-msoft-float' build.log-V1-disable-mipsfpu | wc -l
> 0

So, before the patch when you pass the --disable-mipsfpu option, what
configure does is not adding the -mhard-float option to the CFLAGS. But
also it doesn't add -msoft-float. So no float option is passed to the
compiler at all.

Given that you don't pass any of those two options to the compiler, the
default one will be used, which I think it will be -mhard-float.

Look at this simple test:

$ cat test.c
int main(){return 0;}
$ # USING -mhard-float
$ mips-linux-gnu-gcc -mhard-float test.c
$ mips-linux-gnu-objdump -x a.out | grep "FP ABI"
FP ABI: Hard float (double precision)
$ # USING -msoft-float
$ mips-linux-gnu-gcc -msoft-float test.c
$ mips-linux-gnu-objdump -x a.out | grep "FP ABI"
FP ABI: Soft float
$ # USING COMPILER'S DEFAULT
$ mips-linux-gnu-gcc test.c
$ mips-linux-gnu-objdump -x a.out | grep "FP ABI"
FP ABI: Hard float (double precision)

So, as you can see, before that patch, when we were passing
--disable-mipsfpu to the configure script, we weren't building ffmpeg
for soft-float. We were actually building it for the compiler's default
floatness, which could be either soft-float or (more likely) hard-float.

That's why you didn't see those warnings, because everything was being
built for hard-float.

> after the patch:
> grep '\-mhard-float' build.log-V1-disable-mipsfpu-with-patch | wc -l
> 0
> grep '\-msoft-float' build.log-V1-disable-mipsfpu-with-patch | wc -l
> 1428
> grep "mips-linux-gnu-gcc" build.log-V1-disable-mipsfpu-with-patch | wc -l
> 1428

This is what doesn't make sense to me. Every time your compiler is
called it has the -msoft-float option with it, so everything it has
built was built for soft-float.

> also forget about filtfmts, its not specifici to that
> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: ffprobe_g uses hard float, libavutil/libavutil.a(samplefmt.o) uses soft float
> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: ffprobe_g uses hard float, libavutil/libavutil.a(sha.o) uses soft float
> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: ffprobe_g uses hard float, libavutil/libavutil.a(sha512.o) uses soft float
> /usr/lib/gcc/mips-linux-gnu/4.4.5/../../../../mips-linux-gnu/bin/ld: Warning: ffprobe_g uses hard float, libavutil/libavutil.a(stereo3d.o) uses soft float

Can you grep the output of "mips-linux-gnu-objdump -x ffprobe_g" and
search for "FP ABI" in order to see if it actually uses hard float?

Also it seems those kind of warnings are being emitted by ld, which in
my build log is not used.

Regards,

Vincent.

> 
> [...]
> 


More information about the ffmpeg-devel mailing list