aboutsummaryrefslogtreecommitdiff
path: root/editors/openoffice.org-2-devel/files/patch-i76968
diff options
context:
space:
mode:
Diffstat (limited to 'editors/openoffice.org-2-devel/files/patch-i76968')
-rw-r--r--editors/openoffice.org-2-devel/files/patch-i76968642
1 files changed, 642 insertions, 0 deletions
diff --git a/editors/openoffice.org-2-devel/files/patch-i76968 b/editors/openoffice.org-2-devel/files/patch-i76968
new file mode 100644
index 000000000000..8bf3e43d703d
--- /dev/null
+++ b/editors/openoffice.org-2-devel/files/patch-i76968
@@ -0,0 +1,642 @@
+Sync FreeBSD-specific files with CWS sixtyfour11.
+
+--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/makefile.mk Thu Jan 25 08:27:35 2007
++++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/makefile.mk Wed Apr 25 10:57:20 2007
+@@ -52,11 +52,6 @@
+ CFLAGS += -DLEAK_STATIC_DATA
+ .ENDIF
+
+-NOOPTFILES= \
+- $(SLO)$/uno2cpp.obj
+-
+-
+-CFLAGSNOOPT=-O0
+
+ SLOFILES= \
+ $(SLO)$/abi.obj \
+--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx Thu May 3 21:45:19 2007
++++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx Wed Apr 25 10:57:33 2007
+@@ -38,6 +38,7 @@
+
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <rtl/alloc.h>
+
+ #include <com/sun/star/uno/genfunc.hxx>
+@@ -55,265 +56,188 @@
+ using namespace ::rtl;
+ using namespace ::com::sun::star::uno;
+
+-void dummy_can_throw_anything( char const * );
+-
+-// 6 integral parameters are passed in registers
+-const sal_uInt32 GPR_COUNT = 6;
+-
+-// 8 floating point parameters are passed in SSE registers
+-const sal_uInt32 FPR_COUNT = 8;
+-
+-static inline void
+-invoke_count_words(char * pPT, // Parameter Types
+- sal_uInt32 & nr_gpr, // Number of arguments in GPRs
+- sal_uInt32 & nr_fpr, // Number of arguments in FPRs
+- sal_uInt32 & nr_stack) // Number of arguments in stack
+-{
+- nr_gpr = 0;
+- nr_fpr = 0;
+- nr_stack = 0;
+- char c;
+-
+- while ((c = *pPT++) != 'X')
+- {
+- if (c == 'F' || c == 'D')
+- {
+- if (nr_fpr < FPR_COUNT)
+- nr_fpr++;
+- else
+- nr_stack++;
+- }
+- else
+- {
+- if (nr_gpr < GPR_COUNT)
+- nr_gpr++;
+- else
+- nr_stack++;
+- }
+- }
+-}
+-
+-static void
+-invoke_copy_to_stack(sal_uInt64 * pDS, // Stack Storage
+- char * pPT, // Parameter Types
+- sal_uInt64 * pSV, // Source Values
+- sal_uInt64 * pGPR, // General Purpose Registers
+- double * pFPR) // Floating-Point Registers
+-{
+- sal_uInt32 nr_gpr = 0;
+- sal_uInt32 nr_fpr = 0;
+- sal_uInt64 value;
+- char c;
+-
+- while ((c = *pPT++) != 'X')
+- {
+- switch (c)
+- {
+- case 'D': // Double
+- if (nr_fpr < FPR_COUNT)
+- pFPR[nr_fpr++] = *reinterpret_cast<double *>( pSV++ );
+- else
+- *pDS++ = *pSV++;
+- break;
+-
+- case 'F': // Float
+- if (nr_fpr < FPR_COUNT)
+- // The value in %xmm register is already prepared to
+- // be retrieved as a float. Therefore, we pass the
+- // value verbatim, as a double without conversion.
+- pFPR[nr_fpr++] = *reinterpret_cast<double *>( pSV++ );
+- else
+- *pDS++ = *pSV++;
+- break;
+-
+- case 'H': // 64-bit Word
+- if (nr_gpr < GPR_COUNT)
+- pGPR[nr_gpr++] = *pSV++;
+- else
+- *pDS++ = *pSV++;
+- break;
+-
+- case 'I': // 32-bit Word
+- if (nr_gpr < GPR_COUNT)
+- pGPR[nr_gpr++] = *reinterpret_cast<sal_uInt32 *>( pSV++ );
+- else
+- *pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV++ );
+- break;
+-
+- case 'S': // 16-bit Word
+- if (nr_gpr < GPR_COUNT)
+- pGPR[nr_gpr++] = *reinterpret_cast<sal_uInt16 *>( pSV++ );
+- else
+- *pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV++ );
+- break;
+-
+- case 'B': // Byte
+- if (nr_gpr < GPR_COUNT)
+- pGPR[nr_gpr++] = *reinterpret_cast<sal_uInt8 *>( pSV++ );
+- else
+- *pDS++ = *reinterpret_cast<sal_uInt8 *>( pSV++ );
+- break;
+-
+- default: // Default, assume 64-bit values
+- if (nr_gpr < GPR_COUNT)
+- pGPR[nr_gpr++] = *pSV++;
+- else
+- *pDS++ = *pSV++;
+- break;
+- }
+- }
+-}
+-
+ //==================================================================================================
+ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
+- void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
+- char * pPT, sal_uInt64 * pStackLongs, sal_uInt32 nStackLongs)
+-{
+- sal_uInt32 nr_gpr, nr_fpr, nr_stack;
+- invoke_count_words(pPT, nr_gpr, nr_fpr, nr_stack);
++ void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
++ sal_uInt64 *pStack, sal_uInt32 nStack,
++ sal_uInt64 *pGPR, sal_uInt32 nGPR,
++ double *pFPR, sal_uInt32 nFPR) __attribute__((noinline));
+
+- // Stack, if used, must be 16-bytes aligned
+- if (nr_stack)
+- nr_stack = (nr_stack + 1) & ~1;
+-
++static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
++ void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
++ sal_uInt64 *pStack, sal_uInt32 nStack,
++ sal_uInt64 *pGPR, sal_uInt32 nGPR,
++ double *pFPR, sal_uInt32 nFPR)
++{
+ #if OSL_DEBUG_LEVEL > 1
+- // Let's figure out what is really going on here
+- fprintf(stderr,"callVirtualMethod() parameters string is %s\n", pPT);
+- {
+- sal_uInt32 k = nStackLongs;
+- sal_uInt64 *q = pStackLongs;
+- while (k > 0)
+- {
+- fprintf(stderr, "uno stack is: %lx\n", *q);
+- k--;
+- q++;
+- }
+- }
+-#endif
+-
+- // Load parameters to stack, if necessary
+- sal_uInt64 *stack = (sal_uInt64 *) __builtin_alloca(nr_stack * 8);
+- sal_uInt64 gpregs[GPR_COUNT];
+- double fpregs[FPR_COUNT];
+- invoke_copy_to_stack(stack, pPT, pStackLongs, gpregs, fpregs);
+-
+- // Load FPR registers from fpregs[]
+- register double d0 asm("xmm0");
+- register double d1 asm("xmm1");
+- register double d2 asm("xmm2");
+- register double d3 asm("xmm3");
+- register double d4 asm("xmm4");
+- register double d5 asm("xmm5");
+- register double d6 asm("xmm6");
+- register double d7 asm("xmm7");
+-
+- switch (nr_fpr) {
+-#define ARG_FPR(N) \
+- case N+1: d##N = fpregs[N];
+- ARG_FPR(7);
+- ARG_FPR(6);
+- ARG_FPR(5);
+- ARG_FPR(4);
+- ARG_FPR(3);
+- ARG_FPR(2);
+- ARG_FPR(1);
+- ARG_FPR(0);
+- case 0:;
+-#undef ARG_FPR
+- }
+-
+- // Load GPR registers from gpregs[]
+- register sal_uInt64 a0 asm("rdi");
+- register sal_uInt64 a1 asm("rsi");
+- register sal_uInt64 a2 asm("rdx");
+- register sal_uInt64 a3 asm("rcx");
+- register sal_uInt64 a4 asm("r8");
+- register sal_uInt64 a5 asm("r9");
+-
+- switch (nr_gpr) {
+-#define ARG_GPR(N) \
+- case N+1: a##N = gpregs[N];
+- ARG_GPR(5);
+- ARG_GPR(4);
+- ARG_GPR(3);
+- ARG_GPR(2);
+- ARG_GPR(1);
+- ARG_GPR(0);
+- case 0:;
+-#undef ARG_GPR
++ // Let's figure out what is really going on here
++ {
++ fprintf( stderr, "= callVirtualMethod() =\nGPR's (%d): ", nGPR );
++ for ( int i = 0; i < nGPR; ++i )
++ fprintf( stderr, "0x%lx, ", pGPR[i] );
++ fprintf( stderr, "\nFPR's (%d): ", nFPR );
++ for ( int i = 0; i < nFPR; ++i )
++ fprintf( stderr, "%f, ", pFPR[i] );
++ fprintf( stderr, "\nStack (%d): ", nStack );
++ for ( int i = 0; i < nStack; ++i )
++ fprintf( stderr, "0x%lx, ", pStack[i] );
++ fprintf( stderr, "\n" );
+ }
++#endif
+
+- if ( bSimpleReturn )
+- a0 = (sal_uInt64) pThis;
+- else
+- a1 = (sal_uInt64) pThis;
+-
+- // Ensure that assignments to SSE registers won't be optimized away
+- asm("" ::
+- "x" (d0), "x" (d1), "x" (d2), "x" (d3),
+- "x" (d4), "x" (d5), "x" (d6), "x" (d7));
++ // The call instruction within the asm section of callVirtualMethod may throw
++ // exceptions. So that the compiler handles this correctly, it is important
++ // that (a) callVirtualMethod might call dummy_can_throw_anything (although this
++ // never happens at runtime), which in turn can throw exceptions, and (b)
++ // callVirtualMethod is not inlined at its call site (so that any exceptions are
++ // caught which are thrown from the instruction calling callVirtualMethod):
++ if ( !pThis )
++ CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything( "xxx" ); // address something
++
++ // Should not happen, but...
++ if ( nFPR > x86_64::MAX_SSE_REGS )
++ nFPR = x86_64::MAX_SSE_REGS;
++ if ( nGPR > x86_64::MAX_GPR_REGS )
++ nGPR = x86_64::MAX_GPR_REGS;
+
+ // Get pointer to method
+ sal_uInt64 pMethod = *((sal_uInt64 *)pThis);
+ pMethod += 8 * nVtableIndex;
+ pMethod = *((sal_uInt64 *)pMethod);
+
+- union ReturnValue {
+- struct {
+- sal_uInt64 rax;
+- sal_uInt64 rdx;
+- } i;
+- struct {
+- double xmm0;
+- double xmm1;
+- } f;
+- };
++ // Load parameters to stack, if necessary
++ if ( nStack )
++ {
++ // 16-bytes aligned
++ sal_uInt32 nStackBytes = ( ( nStack + 1 ) >> 1 ) * 16;
++ sal_uInt64 *pCallStack = (sal_uInt64 *) __builtin_alloca( nStackBytes );
++ memcpy( pCallStack, pStack, nStackBytes );
++ }
+
+- typedef ReturnValue (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 );
++ // Return values
++ sal_uInt64 rax;
++ sal_uInt64 rdx;
++ double xmm0;
+
+- // Perform the call
+- ReturnValue aRet = ( ( FunctionCall ) pMethod )( a0, a1, a2, a3, a4, a5 );
++ asm volatile (
++
++ // Fill the xmm registers
++ "movq %2, %%rax\n\t"
+
+- switch (pReturnTypeDescr->eTypeClass)
+- {
+- case typelib_TypeClass_HYPER:
+- case typelib_TypeClass_UNSIGNED_HYPER:
+- *reinterpret_cast<sal_uInt64 *>( pRegisterReturn ) = aRet.i.rax;
+- break;
+- case typelib_TypeClass_LONG:
+- case typelib_TypeClass_UNSIGNED_LONG:
+- case typelib_TypeClass_ENUM:
+- *reinterpret_cast<sal_uInt32 *>( pRegisterReturn ) = *reinterpret_cast<sal_uInt32*>( &aRet.i.rax );
+- break;
+- case typelib_TypeClass_CHAR:
+- case typelib_TypeClass_SHORT:
+- case typelib_TypeClass_UNSIGNED_SHORT:
+- *reinterpret_cast<sal_uInt16 *>( pRegisterReturn ) = *reinterpret_cast<sal_uInt16*>( &aRet.i.rax );
+- break;
+- case typelib_TypeClass_BOOLEAN:
+- case typelib_TypeClass_BYTE:
+- *reinterpret_cast<sal_uInt8 *>( pRegisterReturn ) = *reinterpret_cast<sal_uInt8*>( &aRet.i.rax );
+- break;
+- case typelib_TypeClass_FLOAT:
+- *reinterpret_cast<float *>( pRegisterReturn ) = *reinterpret_cast<float*>( &aRet.f.xmm0 );
+- break;
+- case typelib_TypeClass_DOUBLE:
+- *reinterpret_cast<double *>( pRegisterReturn ) = *reinterpret_cast<double*>( &aRet.f.xmm0 );
+- break;
+- default: {
+- sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
+- if (bSimpleReturn && nRetSize <= 16 && nRetSize > 0) {
+- if (nRetSize > 8)
+- static_cast<sal_uInt64 *>(pRegisterReturn)[1] = aRet.i.rdx;
+- static_cast<sal_uInt64 *>(pRegisterReturn)[0] = aRet.i.rax;
+- }
++ "movsd (%%rax), %%xmm0\n\t"
++ "movsd 8(%%rax), %%xmm1\n\t"
++ "movsd 16(%%rax), %%xmm2\n\t"
++ "movsd 24(%%rax), %%xmm3\n\t"
++ "movsd 32(%%rax), %%xmm4\n\t"
++ "movsd 40(%%rax), %%xmm5\n\t"
++ "movsd 48(%%rax), %%xmm6\n\t"
++ "movsd 56(%%rax), %%xmm7\n\t"
++
++ // Fill the general purpose registers
++ "movq %1, %%rax\n\t"
++
++ "movq (%%rax), %%rdi\n\t"
++ "movq 8(%%rax), %%rsi\n\t"
++ "movq 16(%%rax), %%rdx\n\t"
++ "movq 24(%%rax), %%rcx\n\t"
++ "movq 32(%%rax), %%r8\n\t"
++ "movq 40(%%rax), %%r9\n\t"
++
++ // Perform the call
++ "movq %0, %%r11\n\t"
++ "movq %3, %%rax\n\t"
++ "call *%%r11\n\t"
++
++ // Fill the return values
++ "movq %%rax, %4\n\t"
++ "movq %%rdx, %5\n\t"
++ "movsd %%xmm0, %6\n\t"
++ :
++ : "m" ( pMethod ), "m" ( pGPR ), "m" ( pFPR ), "m" ( nFPR ),
++ "m" ( rax ), "m" ( rdx ), "m" ( xmm0 )
++ : "rax", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r11"
++ );
++
++ switch (pReturnTypeDescr->eTypeClass)
++ {
++ case typelib_TypeClass_HYPER:
++ case typelib_TypeClass_UNSIGNED_HYPER:
++ *reinterpret_cast<sal_uInt64 *>( pRegisterReturn ) = rax;
+ break;
++ case typelib_TypeClass_LONG:
++ case typelib_TypeClass_UNSIGNED_LONG:
++ case typelib_TypeClass_ENUM:
++ *reinterpret_cast<sal_uInt32 *>( pRegisterReturn ) = *reinterpret_cast<sal_uInt32*>( &rax );
++ break;
++ case typelib_TypeClass_CHAR:
++ case typelib_TypeClass_SHORT:
++ case typelib_TypeClass_UNSIGNED_SHORT:
++ *reinterpret_cast<sal_uInt16 *>( pRegisterReturn ) = *reinterpret_cast<sal_uInt16*>( &rax );
++ break;
++ case typelib_TypeClass_BOOLEAN:
++ case typelib_TypeClass_BYTE:
++ *reinterpret_cast<sal_uInt8 *>( pRegisterReturn ) = *reinterpret_cast<sal_uInt8*>( &rax );
++ break;
++ case typelib_TypeClass_FLOAT:
++ case typelib_TypeClass_DOUBLE:
++ *reinterpret_cast<double *>( pRegisterReturn ) = xmm0;
++ break;
++ default:
++ {
++ sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
++ if (bSimpleReturn && nRetSize <= 16 && nRetSize > 0)
++ {
++ if (nRetSize > 8)
++ static_cast<sal_uInt64 *>(pRegisterReturn)[1] = rdx;
++ static_cast<sal_uInt64 *>(pRegisterReturn)[0] = rax;
++ }
++ break;
++ }
+ }
+- }
+ }
+
++//==================================================================================================
++
++// Macros for easier insertion of values to registers or stack
++// pSV - pointer to the source
++// nr - order of the value [will be increased if stored to register]
++// pFPR, pGPR - pointer to the registers
++// pDS - pointer to the stack [will be increased if stored here]
++
++// The value in %xmm register is already prepared to be retrieved as a float,
++// thus we treat float and double the same
++#define INSERT_FLOAT_DOUBLE( pSV, nr, pFPR, pDS ) \
++ if ( nr < x86_64::MAX_SSE_REGS ) \
++ pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
++ else \
++ *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
++
++#define INSERT_INT64( pSV, nr, pGPR, pDS ) \
++ if ( nr < x86_64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
++ else \
++ *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV );
++
++#define INSERT_INT32( pSV, nr, pGPR, pDS ) \
++ if ( nr < x86_64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
++ else \
++ *pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
++
++#define INSERT_INT16( pSV, nr, pGPR, pDS ) \
++ if ( nr < x86_64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
++ else \
++ *pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
++
++#define INSERT_INT8( pSV, nr, pGPR, pDS ) \
++ if ( nr < x86_64::MAX_GPR_REGS ) \
++ pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
++ else \
++ *pDS++ = *reinterpret_cast<sal_uInt8 *>( pSV );
+
+ //==================================================================================================
++
+ static void cpp_call(
+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+ bridges::cpp_uno::shared::VtableSlot aVtableSlot,
+@@ -322,54 +246,52 @@
+ void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
+ {
+ // Maxium space for [complex ret ptr], values | ptr ...
+- char * pCppStack = (char *)__builtin_alloca( (nParams + 3) * sizeof(sal_uInt64) );
+- char * pCppStackStart = pCppStack;
++ // (but will be used less - some of the values will be in pGPR and pFPR)
++ sal_uInt64 *pStack = (sal_uInt64 *)__builtin_alloca( (nParams + 3) * sizeof(sal_uInt64) );
++ sal_uInt64 *pStackStart = pStack;
+
+- // We need to know parameter types for callVirtualMethod() so generate a signature string
+- char * pParamType = (char *)__builtin_alloca( nParams + 3 );
+- char * pPT = pParamType;
++ sal_uInt64 pGPR[x86_64::MAX_GPR_REGS];
++ sal_uInt32 nGPR = 0;
++
++ double pFPR[x86_64::MAX_SSE_REGS];
++ sal_uInt32 nFPR = 0;
+
+ // Return
+ typelib_TypeDescription * pReturnTypeDescr = 0;
+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+ OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
+
+- void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
++ void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion (see below)
+
+ bool bSimpleReturn = true;
+- if (pReturnTypeDescr)
++ if ( pReturnTypeDescr )
+ {
+ if ( x86_64::return_in_hidden_param( pReturnTypeRef ) )
+ bSimpleReturn = false;
+
+- if (bSimpleReturn)
++ if ( bSimpleReturn )
+ pCppReturn = pUnoReturn; // direct way for simple types
+ else
+ {
+ // complex return via ptr
+- pCppReturn = *(void **)pCppStack = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+- ? __builtin_alloca( pReturnTypeDescr->nSize )
+- : pUnoReturn); // direct way
+- *pPT++ = 'H';
+- pCppStack += sizeof(void *);
++ pCppReturn = bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )?
++ __builtin_alloca( pReturnTypeDescr->nSize ) : pUnoReturn;
++ INSERT_INT64( &pCppReturn, nGPR, pGPR, pStack );
+ }
+ }
+
+ // Push "this" pointer
+ void * pAdjustedThisPtr = reinterpret_cast< void ** >( pThis->getCppI() ) + aVtableSlot.offset;
+- *(void **)pCppStack = pAdjustedThisPtr;
+- *pPT++ = 'H';
+- pCppStack += sizeof(void *);
++ INSERT_INT64( &pAdjustedThisPtr, nGPR, pGPR, pStack );
+
+- // stack space
+ // Args
+- void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams );
++ void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams );
+ // Indizes of values this have to be converted (interface conversion cpp<=>uno)
+ sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams);
+ // Type descriptions for reconversions
+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams));
+
+- sal_Int32 nTempIndizes = 0;
++ sal_Int32 nTempIndizes = 0;
+
+ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+ {
+@@ -379,45 +301,32 @@
+
+ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+ {
+- uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr,
++ uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), pUnoArgs[nPos], pParamTypeDescr,
+ pThis->getBridge()->getUno2Cpp() );
+
+ switch (pParamTypeDescr->eTypeClass)
+ {
+-
+- // we need to know type of each param so that we know whether to use
+- // gpr or fpr to pass in parameters:
+- // Key: I - 32-bit value passed in gpr
+- // B - byte value passed in gpr
+- // S - short value passed in gpr
+- // F - float value pass in fpr
+- // D - double value pass in fpr
+- // H - long value passed in gpr
+- // X - indicates end of parameter description string
+-
++ case typelib_TypeClass_HYPER:
++ case typelib_TypeClass_UNSIGNED_HYPER:
++ INSERT_INT64( pCppArgs[nPos], nGPR, pGPR, pStack );
++ break;
+ case typelib_TypeClass_LONG:
+ case typelib_TypeClass_UNSIGNED_LONG:
+ case typelib_TypeClass_ENUM:
+- *pPT++ = 'I';
++ INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack );
+ break;
+ case typelib_TypeClass_SHORT:
+ case typelib_TypeClass_CHAR:
+ case typelib_TypeClass_UNSIGNED_SHORT:
+- *pPT++ = 'S';
++ INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack );
+ break;
+ case typelib_TypeClass_BOOLEAN:
+ case typelib_TypeClass_BYTE:
+- *pPT++ = 'B';
++ INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack );
+ break;
+ case typelib_TypeClass_FLOAT:
+- *pPT++ = 'F';
+- break;
+ case typelib_TypeClass_DOUBLE:
+- *pPT++ = 'D';
+- break;
+- case typelib_TypeClass_HYPER:
+- case typelib_TypeClass_UNSIGNED_HYPER:
+- *pPT++ = 'H';
++ INSERT_FLOAT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack );
+ break;
+ }
+
+@@ -430,7 +339,7 @@
+ {
+ // cpp out is constructed mem, uno out is not!
+ uno_constructData(
+- *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
++ pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+ pParamTypeDescr );
+ pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+ // will be released at reconversion
+@@ -440,7 +349,7 @@
+ else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+ {
+ uno_copyAndConvertData(
+- *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
++ pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+ pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
+
+ pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+@@ -449,27 +358,22 @@
+ }
+ else // direct way
+ {
+- *(void **)pCppStack = pCppArgs[nPos] = pUnoArgs[nPos];
++ pCppArgs[nPos] = pUnoArgs[nPos];
+ // no longer needed
+ TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+ }
+- // FIXME: is this the right way to pass these?
+- *pPT++='H';
++ INSERT_INT64( &(pCppArgs[nPos]), nGPR, pGPR, pStack );
+ }
+- pCppStack += sizeof(sal_uInt64); // standard parameter length
+ }
+
+- // terminate the signature string
+- *pPT++ = 'X';
+- *pPT = 0;
+-
+ try
+ {
+- OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 7), "UNALIGNED STACK !!! (Please DO panic)" );
+ callVirtualMethod(
+ pAdjustedThisPtr, aVtableSlot.index,
+- pCppReturn, pReturnTypeDescr, bSimpleReturn, pParamType,
+- (sal_uInt64 *)pCppStackStart, (pCppStack - pCppStackStart) / sizeof(sal_uInt64) );
++ pCppReturn, pReturnTypeDescr, bSimpleReturn,
++ pStackStart, ( pStack - pStackStart ),
++ pGPR, nGPR,
++ pFPR, nFPR );
+ // NO exception occured...
+ *ppUnoExc = 0;
+
+@@ -525,8 +429,8 @@
+ }
+ }
+
+-
+ //==================================================================================================
++
+ namespace bridges { namespace cpp_uno { namespace shared {
+
+ void unoInterfaceProxyDispatch(