diff options
author | Herbert Dürr <hdu@apache.org> | 2014-02-13 13:21:50 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-02-14 15:09:18 +0000 |
commit | 1e3e7b077f708aefd2e866eca85abc822ae4cd02 (patch) | |
tree | fde0b61f731e212a5c428b758f71094c65e624f6 /bridges | |
parent | f7e335ddb7223d421dc479c9bf8f1d8e710a9d30 (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.cxx | 17 |
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" |