[x265] [PATCH RFC] manually align the stack for GCC x86_32 builds

dave dtyx265 at gmail.com
Fri Apr 18 00:27:21 CEST 2014


How do I build for x86_32 on an x86_64 system?  I added
CMAKE_ASM_YASM_FLAGS  --arch=x86 --machine=x86
CMAKE_CXX_FLAGS, CMAKE_C_FLAGS, CMAKE_EXE_LINKER_FLAGS, 
CMAKE_MODULE_LINKER_FLAGS, CMAKE_SHARED_LINKER_FLAGS all set to -m32 and 
I get

Linking CXX shared library libx265.so
/usr/bin/ld: skipping incompatible 
/usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible 
/usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status
make[2]: *** [libx265.so.0.9] Error 1
make[1]: *** [CMakeFiles/x265-shared.dir/all] Error 2
make: *** [all] Error 2

I have libstdc++ for 32bit installed at /usr/lib32 but I can't get ld to 
find it.

On 04/17/2014 12:16 PM, Steve Borho wrote:
> # HG changeset patch
> # User Steve Borho <steve at borho.org>
> # Date 1397762142 18000
> #      Thu Apr 17 14:15:42 2014 -0500
> # Node ID 171b8496ccc6604691f7fb5cc01348d8d4f888cf
> # Parent  adb708655a30e7f3b2d1fd391740214c2cb2fb1c
> manually align the stack for GCC x86_32 builds
>
> This needs testing on GCC built x86_32 platforms, any volunteers?
>
> For all threads x265 creates I'm hoping we can align the stack immediately in
> the call to threadMain().
>
> At first glance, it seems only the call to x265_encoder_encode() needs to be
> stack aligned.
>
> diff -r adb708655a30 -r 171b8496ccc6 source/cmake/CMakeASM_YASMInformation.cmake
> --- a/source/cmake/CMakeASM_YASMInformation.cmake	Wed Apr 16 14:44:12 2014 +0530
> +++ b/source/cmake/CMakeASM_YASMInformation.cmake	Thu Apr 17 14:15:42 2014 -0500
> @@ -21,8 +21,7 @@
>       endif()
>   endif()
>   
> -# we cannot assume 16-byte stack alignment on x86_32 even with GCC
> -if(GCC AND X64)
> +if(GCC)
>       set(ASM_FLAGS "${ASM_FLAGS} -DHAVE_ALIGNED_STACK=1")
>   else()
>       set(ASM_FLAGS "${ASM_FLAGS} -DHAVE_ALIGNED_STACK=0")
> diff -r adb708655a30 -r 171b8496ccc6 source/common/common.h
> --- a/source/common/common.h	Wed Apr 16 14:44:12 2014 +0530
> +++ b/source/common/common.h	Thu Apr 17 14:15:42 2014 -0500
> @@ -47,10 +47,21 @@
>   #define ALIGN_VAR_8(T, var)  T var __attribute__((aligned(8)))
>   #define ALIGN_VAR_16(T, var) T var __attribute__((aligned(16)))
>   #define ALIGN_VAR_32(T, var) T var __attribute__((aligned(32)))
> +
> +#if X265_ARCH_X86 && !defined(X86_64)
> +intptr_t x265_stack_align( void (*func)(), ... );
> +#define x265_stack_align(func,...) x265_stack_align((void (*)())func, __VA_ARGS__)
> +#else
> +#define x265_stack_align(func,...) func(__VA_ARGS__)
> +#endif
> +
>   #elif defined(_MSC_VER)
> +
>   #define ALIGN_VAR_8(T, var)  __declspec(align(8)) T var
>   #define ALIGN_VAR_16(T, var) __declspec(align(16)) T var
>   #define ALIGN_VAR_32(T, var) __declspec(align(32)) T var
> +#define x265_stack_align(func,...) func(__VA_ARGS__)
> +
>   #endif // if defined(__GNUC__)
>   
>   #if HIGH_BIT_DEPTH
> diff -r adb708655a30 -r 171b8496ccc6 source/common/threading.cpp
> --- a/source/common/threading.cpp	Wed Apr 16 14:44:12 2014 +0530
> +++ b/source/common/threading.cpp	Thu Apr 17 14:15:42 2014 -0500
> @@ -28,12 +28,18 @@
>   namespace x265 {
>   // x265 private namespace
>   
> +/* C shim for forced stack alignment */
> +static void stackAlignMain(Thread *instance)
> +{
> +    instance->threadMain();
> +}
> +
>   #if _WIN32
>   
>   static DWORD WINAPI ThreadShim(Thread *instance)
>   {
>       // defer processing to the virtual function implemented in the derived class
> -    instance->threadMain();
> +    x265_stack_align(stackAlignMain, instance);
>   
>       return 0;
>   }
> @@ -70,7 +76,7 @@
>       // defer processing to the virtual function implemented in the derived class
>       Thread *instance = reinterpret_cast<Thread *>(opaque);
>   
> -    instance->threadMain();
> +    x265_stack_align(stackAlignMain, instance);
>   
>       return NULL;
>   }
> diff -r adb708655a30 -r 171b8496ccc6 source/encoder/api.cpp
> --- a/source/encoder/api.cpp	Wed Apr 16 14:44:12 2014 +0530
> +++ b/source/encoder/api.cpp	Thu Apr 17 14:15:42 2014 -0500
> @@ -103,6 +103,15 @@
>       return ret;
>   }
>   
> +#if defined(__GNUC__) && X265_ARCH_X86 && !defined(X86_64)
> +/* C wrapper for Encoder::encode() so we can align the stack prior to entry
> + * since the caller may not have aligned the stack enough for us */
> +static int encode_stack_frame(Encoder *enc, bool bEos, const x265_picture* pic, x265_picture *pic_out, NALUnitEBSP **nalunits)
> +{
> +    enc->encode(bEos, pic, pic_out, nalunits);
> +}
> +#endif
> +
>   extern "C"
>   int x265_encoder_encode(x265_encoder *enc, x265_nal **pp_nal, uint32_t *pi_nal, x265_picture *pic_in, x265_picture *pic_out)
>   {
> @@ -111,7 +120,12 @@
>   
>       Encoder *encoder = static_cast<Encoder*>(enc);
>       NALUnitEBSP *nalunits[MAX_NAL_UNITS] = { 0, 0, 0, 0, 0 };
> +
> +#if defined(__GNUC__) && X265_ARCH_X86 && !defined(X86_64)
> +    int numEncoded = x265_stack_align(encode_stack_frame, encoder, !pic_in, pic_in, pic_out, nalunits);
> +#else
>       int numEncoded = encoder->encode(!pic_in, pic_in, pic_out, nalunits);
> +#endif
>   
>       if (pp_nal && numEncoded > 0)
>       {
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel



More information about the x265-devel mailing list