# HG changeset patch # User sb@openoffice.org # Date 1265013600 -3600 # Node ID 35c4f2290244ac18031d3925eb288ed097a8e5b2 # Parent ac69123296facc18631ee9845bedb91dbd8d8718 sb119: #i108371# preserve potential 128bit stack alignment in gcc3_linux_intel UNO bridge (based on a patch by ecatmur) diff -r ac69123296fa -r 35c4f2290244 bridges/source/cpp_uno/gcc3_linux_intel/call.s --- bridges/source/cpp_uno/gcc3_linux_intel/call.s Mon Feb 01 09:25:10 2010 +0100 +++ bridges/source/cpp_uno/gcc3_linux_intel/call.s Mon Feb 01 09:40:00 2010 +0100 @@ -9,7 +9,8 @@ .LCFIg0: movl %esp,%ebp .LCFIg1: - subl $0x4,%esp # 32bit returnValue + subl $0x8,%esp # 32bit returnValue, and preserve potential 128bit + # stack alignment pushl %esp # 32bit &returnValue pushl %ecx # 32bit pCallStack pushl %edx # 32bit nVtableOffset @@ -30,6 +31,7 @@ .LCFIv0: movl %esp,%ebp .LCFIv1: + andl $0xFFFFFFF0,%esp # preserve potential 128bit stack alignment pushl $0 # 32bit null pointer (returnValue not used) pushl %ecx # 32bit pCallStack pushl %edx # 32bit nVtableOffset @@ -49,7 +51,8 @@ .LCFIh0: movl %esp,%ebp .LCFIh1: - subl $0x8,%esp # 64bit returnValue + subl $0x8,%esp # 64bit returnValue (preserves potential 128bit + # stack alignment) pushl %esp # 32bit &returnValue pushl %ecx # 32bit pCallStack pushl %edx # 32bit nVtableOffset @@ -71,7 +74,8 @@ .LCFIf0: movl %esp,%ebp .LCFIf1: - subl $0x4,%esp # 32bit returnValue + subl $0x8,%esp # 32bit returnValue, and preserve potential 128bit + # stack alignment pushl %esp # 32bit &returnValue pushl %ecx # 32bit pCallStack pushl %edx # 32bit nVtableOffset @@ -92,7 +96,8 @@ .LCFId0: movl %esp,%ebp .LCFId1: - subl $0x8,%esp # 64bit returnValue + subl $0x8,%esp # 64bit returnValue (preserves potential 128bit + # stack alignment) pushl %esp # 32bit &returnValue pushl %ecx # 32bit pCallStack pushl %edx # 32bit nVtableOffset @@ -113,7 +118,8 @@ .LCFIc0: movl %esp,%ebp .LCFIc1: - subl $0x4,%esp # 32bit returnValue + subl $0x8,%esp # 32bit returnValue, and preserve potential 128bit + # stack alignment pushl %esp # 32bit &returnValue pushl %ecx # 32bit pCallStack pushl %edx # 32bit nVtableOffset diff -r ac69123296fa -r 35c4f2290244 bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx --- bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx Mon Feb 01 09:25:10 2010 +0100 +++ bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx Mon Feb 01 09:40:00 2010 +0100 @@ -87,6 +87,13 @@ void * stackptr; asm volatile ( "mov %%esp, %6\n\t" + // preserve potential 128bit stack alignment + "and $0xfffffff0, %%esp\n\t" + "mov %0, %%eax\n\t" + "lea -4(,%%eax,4), %%eax\n\t" + "and $0xf, %%eax\n\t" + "sub $0xc, %%eax\n\t" + "add %%eax, %%esp\n\t" // copy values "mov %0, %%eax\n\t" "mov %%eax, %%edx\n\t"