<div dir="ltr">Hi,<div><br></div><div>We try to build the code on 32-bit machine on WinXp platform with GCC,</div><div>We got build error after applying this patch:</div><div><br></div><div><div>[ 78%] Building CXX object encoder/CMakeFiles/encoder.dir/compress.cpp.obj</div>
<div>[ 79%] Building CXX object encoder/CMakeFiles/encoder.dir/reference.cpp.obj</div><div>[ 80%] Building CXX object encoder/CMakeFiles/encoder.dir/encoder.cpp.obj</div><div>[ 81%] Building CXX object encoder/CMakeFiles/encoder.dir/api.cpp.obj</div>
<div><b>c:/Documents and Settings/rajesh/Desktop/x265/source/encoder/api.cpp: In functio</b></div><div><b>n 'int encode_stack_frame(x265::Encoder*, bool, const x265_picture*, x265_pictur</b></div><div><b>e*, x265::NALUnitEBSP**)':</b></div>
<div>c:/Documents and Settings/rajesh/Desktop/x265/source/encoder/api.cpp:112:1: warn</div><div>ing: no return statement in function returning non-void [-Wreturn-type]</div><div> }</div><div> ^</div><div>[ 82%] Building CXX object encoder/CMakeFiles/encoder.dir/weightPrediction.cpp.o</div>
<div>bj</div><div>[ 82%] Built target encoder</div><div>Linking CXX static library libx265.a</div><div>[ 82%] Built target x265-static</div><div>Scanning dependencies of target cli</div><div>[ 84%] Building CXX object CMakeFiles/cli.dir/input/input.cpp.obj</div>
<div>[ 85%] Building CXX object CMakeFiles/cli.dir/input/y4m.cpp.obj</div><div>[ 86%] Building CXX object CMakeFiles/cli.dir/input/yuv.cpp.obj</div><div>[ 87%] Building CXX object CMakeFiles/cli.dir/output/output.cpp.obj</div>
<div>[ 88%] Building CXX object CMakeFiles/cli.dir/output/y4m.cpp.obj</div><div>[ 89%] Building CXX object CMakeFiles/cli.dir/output/yuv.cpp.obj</div><div>[ 90%] Building CXX object CMakeFiles/cli.dir/filters/filters.cpp.obj</div>
<div>[ 91%] Building CXX object CMakeFiles/cli.dir/x265.cpp.obj</div><div>Linking CXX executable x265.exe</div><div><b>libx265.a(threading.cpp.obj):threading.cpp:(.text+0x23): undefined reference to</b></div><div><b>`x265_stack_align(void (*)(), ...)'</b></div>
<div><b>libx265.a(api.cpp.obj):api.cpp:(.text+0x2ec): undefined reference to `x265_stack</b></div><div><b>_align(void (*)(), ...)'</b></div><div>collect2.exe: error: ld returned 1 exit status</div><div>make[2]: *** [x265.exe] Error 1</div>
<div>make[1]: *** [CMakeFiles/cli.dir/all] Error 2</div><div>make: *** [all] Error 2</div></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 17, 2014 at 3:27 PM, dave <span dir="ltr"><<a href="mailto:dtyx265@gmail.com" target="_blank">dtyx265@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">How do I build for x86_32 on an x86_64 system?  I added<br>
CMAKE_ASM_YASM_FLAGS  --arch=x86 --machine=x86<br>
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<br>
<br>
Linking CXX shared library libx265.so<br>
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/<u></u>4.7/libstdc++.so when searching for -lstdc++<br>
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/<u></u>4.7/libstdc++.a when searching for -lstdc++<br>
/usr/bin/ld: cannot find -lstdc++<br>
collect2: error: ld returned 1 exit status<br>
make[2]: *** [libx265.so.0.9] Error 1<br>
make[1]: *** [CMakeFiles/x265-shared.dir/<u></u>all] Error 2<br>
make: *** [all] Error 2<br>
<br>
I have libstdc++ for 32bit installed at /usr/lib32 but I can't get ld to find it.<div class="HOEnZb"><div class="h5"><br>
<br>
On 04/17/2014 12:16 PM, Steve Borho wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
# HG changeset patch<br>
# User Steve Borho <<a href="mailto:steve@borho.org" target="_blank">steve@borho.org</a>><br>
# Date 1397762142 18000<br>
#      Thu Apr 17 14:15:42 2014 -0500<br>
# Node ID 171b8496ccc6604691f7fb5cc01348<u></u>d8d4f888cf<br>
# Parent  adb708655a30e7f3b2d1fd39174021<u></u>4c2cb2fb1c<br>
manually align the stack for GCC x86_32 builds<br>
<br>
This needs testing on GCC built x86_32 platforms, any volunteers?<br>
<br>
For all threads x265 creates I'm hoping we can align the stack immediately in<br>
the call to threadMain().<br>
<br>
At first glance, it seems only the call to x265_encoder_encode() needs to be<br>
stack aligned.<br>
<br>
diff -r adb708655a30 -r 171b8496ccc6 source/cmake/CMakeASM_<u></u>YASMInformation.cmake<br>
--- a/source/cmake/CMakeASM_<u></u>YASMInformation.cmake       Wed Apr 16 14:44:12 2014 +0530<br>
+++ b/source/cmake/CMakeASM_<u></u>YASMInformation.cmake       Thu Apr 17 14:15:42 2014 -0500<br>
@@ -21,8 +21,7 @@<br>
      endif()<br>
  endif()<br>
  -# we cannot assume 16-byte stack alignment on x86_32 even with GCC<br>
-if(GCC AND X64)<br>
+if(GCC)<br>
      set(ASM_FLAGS "${ASM_FLAGS} -DHAVE_ALIGNED_STACK=1")<br>
  else()<br>
      set(ASM_FLAGS "${ASM_FLAGS} -DHAVE_ALIGNED_STACK=0")<br>
diff -r adb708655a30 -r 171b8496ccc6 source/common/common.h<br>
--- a/source/common/common.h    Wed Apr 16 14:44:12 2014 +0530<br>
+++ b/source/common/common.h    Thu Apr 17 14:15:42 2014 -0500<br>
@@ -47,10 +47,21 @@<br>
  #define ALIGN_VAR_8(T, var)  T var __attribute__((aligned(8)))<br>
  #define ALIGN_VAR_16(T, var) T var __attribute__((aligned(16)))<br>
  #define ALIGN_VAR_32(T, var) T var __attribute__((aligned(32)))<br>
+<br>
+#if X265_ARCH_X86 && !defined(X86_64)<br>
+intptr_t x265_stack_align( void (*func)(), ... );<br>
+#define x265_stack_align(func,...) x265_stack_align((void (*)())func, __VA_ARGS__)<br>
+#else<br>
+#define x265_stack_align(func,...) func(__VA_ARGS__)<br>
+#endif<br>
+<br>
  #elif defined(_MSC_VER)<br>
+<br>
  #define ALIGN_VAR_8(T, var)  __declspec(align(8)) T var<br>
  #define ALIGN_VAR_16(T, var) __declspec(align(16)) T var<br>
  #define ALIGN_VAR_32(T, var) __declspec(align(32)) T var<br>
+#define x265_stack_align(func,...) func(__VA_ARGS__)<br>
+<br>
  #endif // if defined(__GNUC__)<br>
    #if HIGH_BIT_DEPTH<br>
diff -r adb708655a30 -r 171b8496ccc6 source/common/threading.cpp<br>
--- a/source/common/threading.cpp       Wed Apr 16 14:44:12 2014 +0530<br>
+++ b/source/common/threading.cpp       Thu Apr 17 14:15:42 2014 -0500<br>
@@ -28,12 +28,18 @@<br>
  namespace x265 {<br>
  // x265 private namespace<br>
  +/* C shim for forced stack alignment */<br>
+static void stackAlignMain(Thread *instance)<br>
+{<br>
+    instance->threadMain();<br>
+}<br>
+<br>
  #if _WIN32<br>
    static DWORD WINAPI ThreadShim(Thread *instance)<br>
  {<br>
      // defer processing to the virtual function implemented in the derived class<br>
-    instance->threadMain();<br>
+    x265_stack_align(<u></u>stackAlignMain, instance);<br>
        return 0;<br>
  }<br>
@@ -70,7 +76,7 @@<br>
      // defer processing to the virtual function implemented in the derived class<br>
      Thread *instance = reinterpret_cast<Thread *>(opaque);<br>
  -    instance->threadMain();<br>
+    x265_stack_align(<u></u>stackAlignMain, instance);<br>
        return NULL;<br>
  }<br>
diff -r adb708655a30 -r 171b8496ccc6 source/encoder/api.cpp<br>
--- a/source/encoder/api.cpp    Wed Apr 16 14:44:12 2014 +0530<br>
+++ b/source/encoder/api.cpp    Thu Apr 17 14:15:42 2014 -0500<br>
@@ -103,6 +103,15 @@<br>
      return ret;<br>
  }<br>
  +#if defined(__GNUC__) && X265_ARCH_X86 && !defined(X86_64)<br>
+/* C wrapper for Encoder::encode() so we can align the stack prior to entry<br>
+ * since the caller may not have aligned the stack enough for us */<br>
+static int encode_stack_frame(Encoder *enc, bool bEos, const x265_picture* pic, x265_picture *pic_out, NALUnitEBSP **nalunits)<br>
+{<br>
+    enc->encode(bEos, pic, pic_out, nalunits);<br>
+}<br>
+#endif<br>
+<br>
  extern "C"<br>
  int x265_encoder_encode(x265_<u></u>encoder *enc, x265_nal **pp_nal, uint32_t *pi_nal, x265_picture *pic_in, x265_picture *pic_out)<br>
  {<br>
@@ -111,7 +120,12 @@<br>
        Encoder *encoder = static_cast<Encoder*>(enc);<br>
      NALUnitEBSP *nalunits[MAX_NAL_UNITS] = { 0, 0, 0, 0, 0 };<br>
+<br>
+#if defined(__GNUC__) && X265_ARCH_X86 && !defined(X86_64)<br>
+    int numEncoded = x265_stack_align(encode_stack_<u></u>frame, encoder, !pic_in, pic_in, pic_out, nalunits);<br>
+#else<br>
      int numEncoded = encoder->encode(!pic_in, pic_in, pic_out, nalunits);<br>
+#endif<br>
        if (pp_nal && numEncoded > 0)<br>
      {<br>
______________________________<u></u>_________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" target="_blank">https://mailman.videolan.org/<u></u>listinfo/x265-devel</a><br>
</blockquote>
<br>
______________________________<u></u>_________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" target="_blank">https://mailman.videolan.org/<u></u>listinfo/x265-devel</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">With Regards,<div><br></div><div>Murugan. V</div><div>+919659287478</div></div>
</div>