From 041a0bdbe8b920dc86edc9a7be3e1444f81ae1d6 Mon Sep 17 00:00:00 2001 From: Anton Mitrofanov Date: Tue, 7 Dec 2010 17:49:21 +0300 Subject: [PATCH] Workaround gcc/ld bug with alignment of static variables/arrays that are initialized to zero --- configure | 7 ++++++- encoder/me.c | 2 -- encoder/rdo.c | 2 +- encoder/slicetype.c | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 9cd7770..4e30819 100755 --- a/configure +++ b/configure @@ -368,7 +368,7 @@ case $host_cpu in x86_64) ARCH="X86_64" AS="yasm" - if [ "$SYS" = MACOSX ];then + if [ "$SYS" = MACOSX ]; then ASFLAGS="$ASFLAGS -f macho64 -m amd64 -DPIC -DPREFIX" if cc_check '' "-arch x86_64"; then CFLAGS="$CFLAGS -arch x86_64" @@ -718,6 +718,11 @@ if cc_check '' -fno-tree-vectorize ; then CFLAGS="$CFLAGS -fno-tree-vectorize" fi +if [ $SYS = MINGW -a $ARCH = X86 ] ; then + # workaround gcc/ld bug with alignment of static variables/arrays that are initialized to zero + cc_check '' -fno-zero-initialized-in-bss && CFLAGS="$CFLAGS -fno-zero-initialized-in-bss" +fi + if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then define fseek fseeko define ftell ftello diff --git a/encoder/me.c b/encoder/me.c index bd0a082..8833973 100644 --- a/encoder/me.c +++ b/encoder/me.c @@ -589,8 +589,6 @@ void x264_me_search_ref( x264_t *h, x264_me_t *m, int16_t (*mvc)[2], int i_mvc, /* successive elimination by comparing DC before a full SAD, * because sum(abs(diff)) >= abs(diff(sum)). */ uint16_t *sums_base = m->integral; - /* due to a GCC bug on some platforms (win32?), zero[] may not actually be aligned. - * this is not a problem because it is not used for any SSE instructions. */ ALIGNED_16( static pixel zero[8*FENC_STRIDE] ); ALIGNED_ARRAY_16( int, enc_dc,[4] ); int sad_size = i_pixel <= PIXEL_8x8 ? PIXEL_8x8 : PIXEL_4x4; diff --git a/encoder/rdo.c b/encoder/rdo.c index effbefc..c5c744e 100644 --- a/encoder/rdo.c +++ b/encoder/rdo.c @@ -119,7 +119,7 @@ static ALWAYS_INLINE int cached_satd( x264_t *h, int size, int x, int y ) static inline int ssd_plane( x264_t *h, int size, int p, int x, int y ) { - ALIGNED_16(static pixel zero[16]); + ALIGNED_16( static pixel zero[16] ); int satd = 0; pixel *fdec = h->mb.pic.p_fdec[p] + x + y*FDEC_STRIDE; pixel *fenc = h->mb.pic.p_fenc[p] + x + y*FENC_STRIDE; diff --git a/encoder/slicetype.c b/encoder/slicetype.c index 5c9f500..d710435 100644 --- a/encoder/slicetype.c +++ b/encoder/slicetype.c @@ -191,7 +191,7 @@ static NOINLINE unsigned int x264_weight_cost_chroma( x264_t *h, x264_frame_t *f pixel *src = ref + i_offset; ALIGNED_ARRAY_16( pixel, buf, [8*8] ); int pixoff = 0; - ALIGNED_16( static pixel flat[9] ) = {0,0,0,0,0,0,0,0,1}; //hack for win32 + ALIGNED_16( static pixel flat[8] ) = {0}; if( w ) { for( int y = 0; y < i_lines; y += 8, pixoff = y*i_stride ) -- 1.6.1.9.g97c34