Message ID | 87imaclyzp.fsf@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [FFmpeg-devel] configure: fix the bigendian test | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
On Wed, 11 Nov 2020, David Michael wrote: > There are two issues: > > The unused global integer does not make it into the compiled object > file, so declare it static to correct this. Umm, what? That sounds entirely counterintuitive to me. If the global integer is non-static, it could be referred to by another object file, so the compiler cannot omit it from the generated object file. On the other side, if the variable is static, the compiler has full visibility over any possible use, and sees that nothing in the same object file refers to it, and thus can omit it if it's unused. // Martin
On Wed, Nov 11, 2020 at 5:18 PM Martin Storsjö <martin@martin.st> wrote: > On Wed, 11 Nov 2020, David Michael wrote: > > There are two issues: > > > > The unused global integer does not make it into the compiled object > > file, so declare it static to correct this. > > Umm, what? That sounds entirely counterintuitive to me. > > If the global integer is non-static, it could be referred to by another > object file, so the compiler cannot omit it from the generated object > file. On the other side, if the variable is static, the compiler has full > visibility over any possible use, and sees that nothing in the same object > file refers to it, and thus can omit it if it's unused. LTO removes it if it is not static. It is always present when it is static. Thanks. David
Am Mi., 11. Nov. 2020 um 16:30 Uhr schrieb David Michael <fedora.dm0@gmail.com>: > > There are two issues: > > The unused global integer does not make it into the compiled object > file, so declare it static to correct this. How can I reproduce this issue? > The hexdump output is line-wrapped, so the expected value will not > be matched when its four bytes are split across two lines. Use the > POSIX "-A n" option to disable printing input offsets and delete > all newline characters to output continuous hex values to grep. Will this work on AIX? Carl Eugen
On Wed, Nov 11, 2020 at 6:20 PM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote: > Am Mi., 11. Nov. 2020 um 16:30 Uhr schrieb David Michael <fedora.dm0@gmail.com>: > > There are two issues: > > > > The unused global integer does not make it into the compiled object > > file, so declare it static to correct this. > > How can I reproduce this issue? The configure test is basically these lines (where I use a PowerPC GCC for a big-endian compiler): echo "unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';" | powerpc-gentoo-linux-gnu-gcc $CFLAGS -c -o test.o -xc - && od -A n -t x1 test.o | tr -d '\n' | grep -o '42 *49 *47 *45' In testing this just now, it seems that the static value is only present when "-O2 -g" is in CFLAGS, which I was always using as the bare minimum flags from various distro packaging environments. So without static, the test is broken with "-flto"; with static, the test is broken without "-O2 -g". Maybe it could just check for a _BIG_ENDIAN preprocessor definition instead. > > The hexdump output is line-wrapped, so the expected value will not > > be matched when its four bytes are split across two lines. Use the > > POSIX "-A n" option to disable printing input offsets and delete > > all newline characters to output continuous hex values to grep. > > Will this work on AIX? I don't have access to test it, but the behavior is described in the Open Group specification, so I assume it would. Thanks. David
> Am 12.11.2020 um 00:41 schrieb David Michael <fedora.dm0@gmail.com>: > >> On Wed, Nov 11, 2020 at 6:20 PM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote: >>> Am Mi., 11. Nov. 2020 um 16:30 Uhr schrieb David Michael <fedora.dm0@gmail.com>: >>> There are two issues: >>> >>> The unused global integer does not make it into the compiled object >>> file, so declare it static to correct this. >> >> How can I reproduce this issue? > > The configure test is basically these lines (where I use a PowerPC GCC > for a big-endian compiler): > > echo "unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';" | > powerpc-gentoo-linux-gnu-gcc $CFLAGS -c -o test.o -xc - && > od -A n -t x1 test.o | tr -d '\n' | grep -o '42 *49 *47 *45' > > In testing this just now, it seems that the static value is only > present when "-O2 -g" is in CFLAGS, which I was always using as the > bare minimum flags from various distro packaging environments. So > without static, the test is broken with "-flto"; with static, the test > is broken without "-O2 -g". Maybe it could just check for a > _BIG_ENDIAN preprocessor definition instead. Sorry for the misunderstanding: What do I have to do (on the command line) to reproduce a problem with current FFmpeg git head? Carl Eugen
On Thu, Nov 12, 2020 at 2:56 AM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote: > > Am 12.11.2020 um 00:41 schrieb David Michael <fedora.dm0@gmail.com>: > >> On Wed, Nov 11, 2020 at 6:20 PM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote: > >>> Am Mi., 11. Nov. 2020 um 16:30 Uhr schrieb David Michael <fedora.dm0@gmail.com>: > >>> There are two issues: > >>> > >>> The unused global integer does not make it into the compiled object > >>> file, so declare it static to correct this. > >> > >> How can I reproduce this issue? > > > > The configure test is basically these lines (where I use a PowerPC GCC > > for a big-endian compiler): > > > > echo "unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';" | > > powerpc-gentoo-linux-gnu-gcc $CFLAGS -c -o test.o -xc - && > > od -A n -t x1 test.o | tr -d '\n' | grep -o '42 *49 *47 *45' > > > > In testing this just now, it seems that the static value is only > > present when "-O2 -g" is in CFLAGS, which I was always using as the > > bare minimum flags from various distro packaging environments. So > > without static, the test is broken with "-flto"; with static, the test > > is broken without "-O2 -g". Maybe it could just check for a > > _BIG_ENDIAN preprocessor definition instead. > > Sorry for the misunderstanding: > What do I have to do (on the command line) to reproduce a problem with current FFmpeg git head? Call the configure script to cross-compile to a big-endian architecture with CFLAGS in the environment. Basically run this with your own compiler prefix: ./configure --enable-cross-compile --host-cc=gcc --arch=powerpc --target-os=linux --cross-prefix=powerpc-unknown-linux-gnu- If CFLAGS contains -flto, you'll see "big-endian no" in the output. That results in compilation failures later due to missing PPC definitions that were conditional on HAVE_BIGENDIAN. Thanks. David
diff --git a/configure b/configure index 2f02d7f5c8..52c02a74c8 100755 --- a/configure +++ b/configure @@ -5749,9 +5749,9 @@ check_cc pragma_deprecated "" '_Pragma("GCC diagnostic ignored \"-Wdeprecated-de # The global variable ensures the bits appear unchanged in the object file. test_cc <<EOF || die "endian test failed" -unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E'; +static unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E'; EOF -od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian +od -A n -t x1 $TMPO | tr -d '\n' | grep -q '42 *49 *47 *45' && enable bigendian check_cc const_nan math.h "struct { double d; } static const bar[] = { { NAN } }"
There are two issues: The unused global integer does not make it into the compiled object file, so declare it static to correct this. The hexdump output is line-wrapped, so the expected value will not be matched when its four bytes are split across two lines. Use the POSIX "-A n" option to disable printing input offsets and delete all newline characters to output continuous hex values to grep. Signed-off-by: David Michael <fedora.dm0@gmail.com> --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)