summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorHerbert Dürr <hdu@apache.org>2014-02-13 13:21:50 +0000
committerCaolán McNamara <caolanm@redhat.com>2014-02-14 15:09:18 +0000
commit1e3e7b077f708aefd2e866eca85abc822ae4cd02 (patch)
treefde0b61f731e212a5c428b758f71094c65e624f6 /bridges
parentf7e335ddb7223d421dc479c9bf8f1d8e710a9d30 (diff)
Resolves: #i124086# preserve 16byte stack alignment...
in gcc3-solaris-intel's uno2cpp bridge Patch-by: Apostolos Syropoulos <asyropoulos123@hotmail.com> Review-by: Herbert Dürr <hdu@apache.org> (cherry picked from commit 95eeed58af27c63977a43c4d688b1467ef3cf047) Conflicts: bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx Change-Id: I92a151c5d65f685a6249954b84da31471501ff9b
Diffstat (limited to 'bridges')
-rw-r--r--bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx17
1 files changed, 16 insertions, 1 deletions
diff --git a/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
index 2999fffe886e..3d7ef690d6bc 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
@@ -39,7 +39,15 @@ namespace
{
//==================================================================================================
-static void callVirtualMethod(
+void callVirtualMethod(
+ void * pAdjustedThisPtr,
+ sal_Int32 nVtableIndex,
+ void * pRegisterReturn,
+ typelib_TypeClass eReturnType,
+ sal_Int32 * pStackLongs,
+ sal_Int32 nStackLongs ) __attribute__((noinline));
+
+void callVirtualMethod(
void * pAdjustedThisPtr,
sal_Int32 nVtableIndex,
void * pRegisterReturn,
@@ -61,6 +69,13 @@ static void callVirtualMethod(
void * stackptr;
asm volatile (
"mov %%esp, %2\n\t"
+ // preserve potential 128bit stack alignment
+ "and $0xfffffff0, %%esp\n\t"
+ "mov %3, %%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 %3, %%eax\n\t"
"mov %%eax, %%edx\n\t"