1b3b3bf68a
Funded by: OpenOffice.org community
377 lines
14 KiB
Text
377 lines
14 KiB
Text
catch up to recent bridge also fixes following issues
|
|
for amd64
|
|
http://www.openoffice.org/issues/show_bug.cgi?id=98781
|
|
http://www.openoffice.org/issues/show_bug.cgi?id=82690
|
|
http://www.freebsd.org/cgi/query-pr.cgi?pr=127946
|
|
|
|
We also need #define USE_DOUBLE_MMAP for FreeBSD as well.
|
|
It's very hard to maintain without it, and performance loss is
|
|
negligible. See also
|
|
http://www.openoffice.org/issues/show_bug.cgi?id=97320
|
|
. Note that i386 also requires the patch for
|
|
"bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx"
|
|
.
|
|
|
|
--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/abi.cxx 2009-12-12 18:15:33.000000000 +0900
|
|
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/abi.cxx 2009-12-06 13:19:58.000000000 +0900
|
|
@@ -229,6 +229,7 @@
|
|
for ( sal_Int32 nMember = 0; nMember < pStruct->nMembers; ++nMember )
|
|
{
|
|
typelib_TypeDescriptionReference *pTypeInStruct = pStruct->ppTypeRefs[ nMember ];
|
|
+ rByteOffset = pStruct->pMemberOffsets[ nMember ];
|
|
|
|
int num = classify_argument( pTypeInStruct, subclasses, rByteOffset );
|
|
|
|
@@ -243,9 +244,6 @@
|
|
int pos = rByteOffset / 8;
|
|
classes[i + pos] = merge_classes( subclasses[i], classes[i + pos] );
|
|
}
|
|
-
|
|
- if ( pTypeInStruct->eTypeClass != typelib_TypeClass_STRUCT )
|
|
- rByteOffset = pStruct->pMemberOffsets[ nMember ];
|
|
}
|
|
|
|
TYPELIB_DANGER_RELEASE( pTypeDescr );
|
|
@@ -332,7 +330,7 @@
|
|
return examine_argument( pTypeRef, true, g, s ) == 0;
|
|
}
|
|
|
|
-void x86_64::fill_struct( typelib_TypeDescriptionReference *pTypeRef, void * const *pGPR, void * const *pSSE, void *pStruct )
|
|
+void x86_64::fill_struct( typelib_TypeDescriptionReference *pTypeRef, const sal_uInt64 *pGPR, const double *pSSE, void *pStruct )
|
|
{
|
|
enum x86_64_reg_class classes[MAX_CLASSES];
|
|
int offset = 0;
|
|
@@ -346,12 +344,14 @@
|
|
{
|
|
case X86_64_INTEGER_CLASS:
|
|
case X86_64_INTEGERSI_CLASS:
|
|
- *pStructAlign++ = *reinterpret_cast<sal_uInt64 *>( *pGPR++ );
|
|
+ *pStructAlign++ = *pGPR++;
|
|
break;
|
|
case X86_64_SSE_CLASS:
|
|
case X86_64_SSESF_CLASS:
|
|
case X86_64_SSEDF_CLASS:
|
|
- *pStructAlign++ = *reinterpret_cast<sal_uInt64 *>( *pSSE++ );
|
|
+ *pStructAlign++ = *reinterpret_cast<const sal_uInt64 *>( pSSE++ );
|
|
+ break;
|
|
+ default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/abi.hxx 2009-12-12 18:15:33.000000000 +0900
|
|
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/abi.hxx 2009-12-06 13:19:58.000000000 +0900
|
|
@@ -63,7 +63,7 @@
|
|
*/
|
|
bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
|
|
|
|
-void fill_struct( typelib_TypeDescriptionReference *pTypeRef, void * const *pGPR, void * const *pSSE, void *pStruct );
|
|
+void fill_struct( typelib_TypeDescriptionReference *pTypeRef, const sal_uInt64* pGPR, const double* pSSE, void *pStruct );
|
|
|
|
} // namespace x86_64
|
|
|
|
|
|
--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/call.s 2009-12-12 18:15:33.000000000 +0900
|
|
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/call.s 2009-12-06 13:19:58.000000000 +0900
|
|
@@ -43,6 +43,9 @@
|
|
je .Lfloat
|
|
|
|
movq -144(%rbp), %rax # Return value (int case)
|
|
+ movq -136(%rbp), %rdx # Return value (int case)
|
|
+ movq -144(%rbp), %xmm0 # Return value (int case)
|
|
+ movq -136(%rbp), %xmm1 # Return value (int case)
|
|
jmp .Lfinish
|
|
.Lfloat:
|
|
movlpd -144(%rbp), %xmm0 # Return value (float/double case)
|
|
|
|
--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/cpp2uno.cxx 2009-12-12 18:15:33.000000000 +0900
|
|
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/cpp2uno.cxx 2009-12-06 13:19:58.000000000 +0900
|
|
@@ -77,8 +77,8 @@
|
|
void ** gpreg, void ** fpreg, void ** ovrflw,
|
|
sal_uInt64 * pRegisterReturn /* space for register return */ )
|
|
{
|
|
- int nr_gpr = 0; //number of gpr registers used
|
|
- int nr_fpr = 0; //number of fpr regsiters used
|
|
+ unsigned int nr_gpr = 0; //number of gpr registers used
|
|
+ unsigned int nr_fpr = 0; //number of fpr registers used
|
|
|
|
// return
|
|
typelib_TypeDescription * pReturnTypeDescr = 0;
|
|
@@ -126,7 +126,10 @@
|
|
|
|
int nUsedGPR = 0;
|
|
int nUsedSSE = 0;
|
|
- bool bFitsRegisters = x86_64::examine_argument( rParam.pTypeRef, false, nUsedGPR, nUsedSSE );
|
|
+#if OSL_DEBUG_LEVEL > 1
|
|
+ bool bFitsRegisters =
|
|
+#endif
|
|
+ x86_64::examine_argument( rParam.pTypeRef, false, nUsedGPR, nUsedSSE );
|
|
if ( !rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ) ) // value
|
|
{
|
|
// Simple types must fit exactly one register on x86_64
|
|
@@ -159,28 +162,7 @@
|
|
else // struct <= 16 bytes || ptr to complex value || ref
|
|
{
|
|
void *pCppStack;
|
|
- char pTmpStruct[16];
|
|
-
|
|
- if ( bFitsRegisters && !rParam.bOut &&
|
|
- ( pParamTypeDescr->eTypeClass == typelib_TypeClass_STRUCT ||
|
|
- pParamTypeDescr->eTypeClass == typelib_TypeClass_EXCEPTION ) )
|
|
- {
|
|
- if ( ( nr_gpr + nUsedGPR <= x86_64::MAX_GPR_REGS ) && ( nr_fpr + nUsedSSE <= x86_64::MAX_SSE_REGS ) )
|
|
- {
|
|
- x86_64::fill_struct( rParam.pTypeRef, gpreg, fpreg, pTmpStruct );
|
|
-#if OSL_DEBUG_LEVEL > 1
|
|
- fprintf( stderr, "nUsedGPR == %d, nUsedSSE == %d, pTmpStruct[0] == 0x%x, pTmpStruct[1] == 0x%x, **gpreg == 0x%lx\n",
|
|
- nUsedGPR, nUsedSSE, pTmpStruct[0], pTmpStruct[1], *(sal_uInt64*)*gpreg );
|
|
-#endif
|
|
-
|
|
- pCppArgs[nPos] = pCppStack = reinterpret_cast<void *>( pTmpStruct );
|
|
- gpreg += nUsedGPR;
|
|
- fpreg += nUsedSSE;
|
|
- }
|
|
- else
|
|
- pCppArgs[nPos] = pCppStack = *ovrflw++;
|
|
- }
|
|
- else if ( nr_gpr < x86_64::MAX_GPR_REGS )
|
|
+ if ( nr_gpr < x86_64::MAX_GPR_REGS )
|
|
{
|
|
pCppArgs[nPos] = pCppStack = *gpreg++;
|
|
nr_gpr++;
|
|
@@ -489,13 +471,12 @@
|
|
//==================================================================================================
|
|
|
|
unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
|
|
- Slot ** slots, unsigned char * code,
|
|
+ Slot ** slots, unsigned char * code, sal_PtrDiff writetoexecdiff,
|
|
typelib_InterfaceTypeDescription const * type, sal_Int32 nFunctionOffset,
|
|
sal_Int32 functionCount, sal_Int32 nVtableOffset )
|
|
{
|
|
(*slots) -= functionCount;
|
|
Slot * s = *slots;
|
|
-
|
|
for ( sal_Int32 nPos = 0; nPos < type->nMembers; ++nPos )
|
|
{
|
|
typelib_TypeDescription * pTD = 0;
|
|
@@ -509,14 +490,14 @@
|
|
reinterpret_cast<typelib_InterfaceAttributeTypeDescription *>( pTD );
|
|
|
|
// get method
|
|
- (s++)->fn = code;
|
|
+ (s++)->fn = code + writetoexecdiff;
|
|
code = codeSnippet( code, nFunctionOffset++, nVtableOffset,
|
|
x86_64::return_in_hidden_param( pAttrTD->pAttributeTypeRef ) );
|
|
|
|
if ( ! pAttrTD->bReadOnly )
|
|
{
|
|
// set method
|
|
- (s++)->fn = code;
|
|
+ (s++)->fn = code + writetoexecdiff;
|
|
code = codeSnippet( code, nFunctionOffset++, nVtableOffset, false );
|
|
}
|
|
}
|
|
@@ -525,7 +506,7 @@
|
|
typelib_InterfaceMethodTypeDescription *pMethodTD =
|
|
reinterpret_cast<typelib_InterfaceMethodTypeDescription *>( pTD );
|
|
|
|
- (s++)->fn = code;
|
|
+ (s++)->fn = code + writetoexecdiff;
|
|
code = codeSnippet( code, nFunctionOffset++, nVtableOffset,
|
|
x86_64::return_in_hidden_param( pMethodTD->pReturnTypeRef ) );
|
|
}
|
|
|
|
--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/except.cxx 2009-12-12 18:15:33.000000000 +0900
|
|
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/except.cxx 2009-12-06 13:19:58.000000000 +0900
|
|
@@ -32,6 +32,7 @@
|
|
#include "precompiled_bridges.hxx"
|
|
|
|
#include <stdio.h>
|
|
+#include <string.h>
|
|
#include <dlfcn.h>
|
|
#include <cxxabi.h>
|
|
#include <hash_map>
|
|
@@ -121,7 +121,7 @@
|
|
};
|
|
//__________________________________________________________________________________________________
|
|
RTTI::RTTI() SAL_THROW( () )
|
|
-#if __FreeBSD_version < 602103
|
|
+#if __FreeBSD_version < 702104 /* #i22253# */
|
|
: m_hApp( dlopen( 0, RTLD_NOW | RTLD_GLOBAL ) )
|
|
#else
|
|
: m_hApp( dlopen( 0, RTLD_LAZY ) )
|
|
@@ -160,7 +160,7 @@
|
|
buf.append( 'E' );
|
|
|
|
OString symName( buf.makeStringAndClear() );
|
|
-#if __FreeBSD_version < 602103 /* #i22253# */
|
|
+#if __FreeBSD_version < 702104 /* #i22253# */
|
|
rtti = (type_info *)dlsym( RTLD_DEFAULT, symName.getStr() );
|
|
#else
|
|
rtti = (type_info *)dlsym( m_hApp, symName.getStr() );
|
|
@@ -175,8 +167,8 @@
|
|
else
|
|
{
|
|
// try to lookup the symbol in the generated rtti map
|
|
- t_rtti_map::const_iterator iFind( m_generatedRttis.find( unoName ) );
|
|
- if (iFind == m_generatedRttis.end())
|
|
+ t_rtti_map::const_iterator iFind2( m_generatedRttis.find( unoName ) );
|
|
+ if (iFind2 == m_generatedRttis.end())
|
|
{
|
|
// we must generate it !
|
|
// symbol and rtti-name is nearly identical,
|
|
@@ -205,7 +197,7 @@
|
|
}
|
|
else // taking already generated rtti
|
|
{
|
|
- rtti = iFind->second;
|
|
+ rtti = iFind2->second;
|
|
}
|
|
}
|
|
}
|
|
|
|
--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx 2009-12-12 18:15:33.000000000 +0900
|
|
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx 2009-12-06 13:19:58.000000000 +0900
|
|
@@ -53,13 +53,13 @@
|
|
|
|
//==================================================================================================
|
|
static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
|
- void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
|
|
+ void * pRegisterReturn, typelib_TypeDescriptionReference * pReturnTypeRef, bool bSimpleReturn,
|
|
sal_uInt64 *pStack, sal_uInt32 nStack,
|
|
sal_uInt64 *pGPR, sal_uInt32 nGPR,
|
|
double *pFPR, sal_uInt32 nFPR) __attribute__((noinline));
|
|
|
|
static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
|
- void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
|
|
+ void * pRegisterReturn, typelib_TypeDescriptionReference * pReturnTypeRef, bool bSimpleReturn,
|
|
sal_uInt64 *pStack, sal_uInt32 nStack,
|
|
sal_uInt64 *pGPR, sal_uInt32 nGPR,
|
|
double *pFPR, sal_uInt32 nFPR)
|
|
@@ -68,13 +68,13 @@
|
|
// Let's figure out what is really going on here
|
|
{
|
|
fprintf( stderr, "= callVirtualMethod() =\nGPR's (%d): ", nGPR );
|
|
- for ( int i = 0; i < nGPR; ++i )
|
|
+ for ( unsigned 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 )
|
|
+ for ( unsigned int i = 0; i < nFPR; ++i )
|
|
fprintf( stderr, "%f, ", pFPR[i] );
|
|
fprintf( stderr, "\nStack (%d): ", nStack );
|
|
- for ( int i = 0; i < nStack; ++i )
|
|
+ for ( unsigned int i = 0; i < nStack; ++i )
|
|
fprintf( stderr, "0x%lx, ", pStack[i] );
|
|
fprintf( stderr, "\n" );
|
|
}
|
|
@@ -113,6 +113,7 @@
|
|
sal_uInt64 rax;
|
|
sal_uInt64 rdx;
|
|
double xmm0;
|
|
+ double xmm1;
|
|
|
|
asm volatile (
|
|
|
|
@@ -147,13 +148,14 @@
|
|
"movq %%rax, %4\n\t"
|
|
"movq %%rdx, %5\n\t"
|
|
"movsd %%xmm0, %6\n\t"
|
|
+ "movsd %%xmm1, %7\n\t"
|
|
:
|
|
: "m" ( pMethod ), "m" ( pGPR ), "m" ( pFPR ), "m" ( nFPR ),
|
|
- "m" ( rax ), "m" ( rdx ), "m" ( xmm0 )
|
|
+ "m" ( rax ), "m" ( rdx ), "m" ( xmm0 ), "m" ( xmm1 )
|
|
: "rax", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r11"
|
|
);
|
|
|
|
- switch (pReturnTypeDescr->eTypeClass)
|
|
+ switch (pReturnTypeRef->eTypeClass)
|
|
{
|
|
case typelib_TypeClass_HYPER:
|
|
case typelib_TypeClass_UNSIGNED_HYPER:
|
|
@@ -179,12 +181,17 @@
|
|
break;
|
|
default:
|
|
{
|
|
- sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
|
|
+ sal_Int32 const nRetSize = pReturnTypeRef->pType->nSize;
|
|
if (bSimpleReturn && nRetSize <= 16 && nRetSize > 0)
|
|
{
|
|
- if (nRetSize > 8)
|
|
- static_cast<sal_uInt64 *>(pRegisterReturn)[1] = rdx;
|
|
- static_cast<sal_uInt64 *>(pRegisterReturn)[0] = rax;
|
|
+ sal_uInt64 longs[2];
|
|
+ longs[0] = rax;
|
|
+ longs[1] = rdx;
|
|
+
|
|
+ double doubles[2];
|
|
+ doubles[0] = xmm0;
|
|
+ doubles[1] = xmm1;
|
|
+ x86_64::fill_struct( pReturnTypeRef, &longs[0], &doubles[0], pRegisterReturn);
|
|
}
|
|
break;
|
|
}
|
|
@@ -323,6 +330,8 @@
|
|
case typelib_TypeClass_DOUBLE:
|
|
INSERT_FLOAT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack );
|
|
break;
|
|
+ default:
|
|
+ break;
|
|
}
|
|
|
|
// no longer needed
|
|
@@ -365,7 +374,7 @@
|
|
{
|
|
callVirtualMethod(
|
|
pAdjustedThisPtr, aVtableSlot.index,
|
|
- pCppReturn, pReturnTypeDescr, bSimpleReturn,
|
|
+ pCppReturn, pReturnTypeRef, bSimpleReturn,
|
|
pStackStart, ( pStack - pStackStart ),
|
|
pGPR, nGPR,
|
|
pFPR, nFPR );
|
|
@@ -435,16 +444,19 @@
|
|
// is my surrogate
|
|
bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
|
|
= static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * >(pUnoI);
|
|
+#if OSL_DEBUG_LEVEL > 0
|
|
typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
|
|
+#endif
|
|
|
|
switch (pMemberDescr->eTypeClass)
|
|
{
|
|
case typelib_TypeClass_INTERFACE_ATTRIBUTE:
|
|
{
|
|
+#if OSL_DEBUG_LEVEL > 0
|
|
// determine vtable call index
|
|
sal_Int32 nMemberPos = ((typelib_InterfaceMemberTypeDescription *)pMemberDescr)->nPosition;
|
|
OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### member pos out of range!" );
|
|
-
|
|
+#endif
|
|
VtableSlot aVtableSlot(
|
|
getVtableSlot(
|
|
reinterpret_cast<
|
|
@@ -489,10 +501,11 @@
|
|
}
|
|
case typelib_TypeClass_INTERFACE_METHOD:
|
|
{
|
|
+#if OSL_DEBUG_LEVEL > 0
|
|
// determine vtable call index
|
|
sal_Int32 nMemberPos = ((typelib_InterfaceMemberTypeDescription *)pMemberDescr)->nPosition;
|
|
OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### member pos out of range!" );
|
|
-
|
|
+#endif
|
|
VtableSlot aVtableSlot(
|
|
getVtableSlot(
|
|
reinterpret_cast<
|
|
--- bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx~ 2009-06-13 16:41:45.000000000 +0900
|
|
+++ bridges/inc/bridges/cpp_uno/shared/vtablefactory.hxx 2009-06-13 16:42:24.000000000 +0900
|
|
@@ -40,7 +40,7 @@
|
|
#include <hash_map>
|
|
|
|
/*See: http://people.redhat.com/drepper/selinux-mem.html*/
|
|
-#ifdef LINUX
|
|
+#if defined (LINUX) || defined (FREEBSD)
|
|
#define USE_DOUBLE_MMAP
|
|
#endif
|
|
|