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

Michael Niedermayer michael at niedermayer.cc
Wed Jan 20 14:15:23 CET 2016


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


> 
> > 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


> 
> 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/



> 
> > 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

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

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


[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Rewriting code that is poorly written but fully understood is good.
Rewriting code that one doesnt understand is a sign that one is less smart
then the original author, trying to rewrite it will not make it better.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160120/978827ca/attachment.sig>


More information about the ffmpeg-devel mailing list