summaryrefslogtreecommitdiff
path: root/bridges/source/cpp_uno/gcc3_linux_sparc
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2004-07-13 15:55:02 +0000
committerRüdiger Timm <rt@openoffice.org>2004-07-13 15:55:02 +0000
commitb79b88c105dd2347cd3fb9dcc3f32d7c16111ade (patch)
treeb48dfabe2309f71185ae515e3ade03eebbd41166 /bridges/source/cpp_uno/gcc3_linux_sparc
parent78cc0234ae891affa418fbf4c376ad838f70b75f (diff)
INTEGRATION: CWS ooo20040620 (1.4.16); FILE MERGED
2004/06/04 12:10:10 sparcmoz 1.4.16.1: #i28110# editing linux sparc bridges code
Diffstat (limited to 'bridges/source/cpp_uno/gcc3_linux_sparc')
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx129
1 files changed, 79 insertions, 50 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx
index ec7207ece032..073040d3575d 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: cpp2uno.cxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: svesik $ $Date: 2004-04-21 13:40:45 $
+ * last change: $Author: rt $ $Date: 2004-07-13 16:55:02 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -58,20 +58,9 @@
*
*
************************************************************************/
-#define LEAK_STATIC_DATA
-#define TRACE(x) OSL_TRACE(x)
-#define TRACE(x)
-
-#include <list>
-#include <map>
-#include <typeinfo>
#include <com/sun/star/uno/genfunc.hxx>
-#ifndef _TYPELIB_TYPEDESCRIPTION_HXX_
#include <typelib/typedescription.hxx>
-#endif
-#ifndef _UNO_DATA_H_
#include <uno/data.h>
-#endif
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
@@ -79,12 +68,9 @@
#include "share.hxx"
using namespace com::sun::star::uno;
-using namespace std;
-using namespace rtl;
namespace
{
-
//==================================================================================================
static typelib_TypeClass cpp2uno_call(
bridges::cpp_uno::shared::CppInterfaceProxy * pThis,
@@ -145,8 +131,8 @@ static typelib_TypeClass cpp2uno_call(
if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) // value
{
- pCppArgs[nPos] = pUnoArgs[nPos] =
- CPPU_CURRENT_NAMESPACE::adjustPointer( pCppStack, pParamTypeDescr );
+ pCppArgs[nPos] = pCppStack;
+ pUnoArgs[nPos] = pCppStack;
switch (pParamTypeDescr->eTypeClass)
{
case typelib_TypeClass_HYPER:
@@ -276,38 +262,42 @@ static typelib_TypeClass cpp2uno_call(
//==================================================================================================
static typelib_TypeClass cpp_mediate(
- sal_Int32 nFunctionIndex,
- sal_Int32 nVtableOffset,
+ int nFunctionIndex,
void ** pCallStack,
+ int nVtableOffset,
sal_Int64 * pRegisterReturn /* space for register return */ )
{
OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
-
// pCallStack: this, params
// eventual [ret*] lies at pCallStack -1
// so count down pCallStack by one to keep it simple
- bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
- = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(
- static_cast< char * >(*pCallStack) - nVtableOffset);
- if ((nFunctionIndex & 0x80000000) != 0) {
+ void * pThis;
+ if (nFunctionIndex & 0x80000000)
+ {
nFunctionIndex &= 0x7FFFFFFF;
- --pCallStack;
+ pThis=pCallStack[1];
+ }
+ else
+ {
+ pThis=pCallStack[0];
}
+ pThis = static_cast< char *>(pThis) - nVtableOffset;
+ bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
+ = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(
+ pThis);
typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex,
"### illegal vtable index!" );
if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
{
- throw RuntimeException( OUString::createFromAscii("illegal vtable index!"), (XInterface *)pCppI );
+ throw RuntimeException( rtl::OUString::createFromAscii("illegal vtable index!"), (XInterface *)pCppI );
}
// determine called method
sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
-
TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
-
//#if defined BRIDGES_DEBUG
// OString cstr( OUStringToOString( aMemberDescr.get()->pTypeName, RTL_TEXTENCODING_ASCII_US ) );
// fprintf( stderr, "calling %s, nVtableCall=%d\n", cstr.getStr(), nVtableCall );
@@ -402,63 +392,102 @@ static typelib_TypeClass cpp_mediate(
// eRet = typelib_TypeClass_VOID;
// }
}
-
return eRet;
}
-}
+
//==================================================================================================
/**
* is called on incoming vtable calls
* (called by asm snippets)
*/
-int cpp_vtable_call(
- sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, void** pCallStack)
+ static void cpp_vtable_call()
{
+ int functionIndex;
+ void** pCallStack;
+ int vtableOffset;
volatile sal_Int64 nRegReturn;
+ // nTableEntry and pCallStack are delivered in registers as usual
+ // but cpp_vtable_call is declared void.
+ // the reason is that this way the compiler won't clobber the
+ // call stack prepared by the assembler snippet to save its input
+ // registers
+ // also restore %i3 here which was clobbered to jump here
+
+ __asm__("st %%i0, %0\n\t"
+ "st %%i1, %1\n\t"
+ "ld [%%fp+68], %%i0\n\t"
+ "ld [%%fp+72], %%i1\n\t"
+ "ld [%%fp+76], %%i2\n\t"
+ "ld [%%fp+80], %%i3\n\t"
+ : : "m"(functionIndex), "m"(pCallStack), "m"(vtableOffset));
+
+
+ sal_Bool bComplex = functionIndex & 0x80000000 ? sal_True : sal_False;
+
typelib_TypeClass aType =
- cpp_mediate( nFunctionIndex, nVtableOffset, pCallStack, (sal_Int64*)&nRegReturn );
- OSL_ASSERT( sizeof(void *) == sizeof(sal_Int32) );
+ cpp_mediate( functionIndex, pCallStack, vtableOffset, (sal_Int64*)&nRegReturn );
+
switch( aType )
{
- // move return value into register space
- // (will be loaded by machine code snippet)
- // Use pCallStack[1/2] instead of pCallStack[0/1], because the former is
- // properly dword aligned:
case typelib_TypeClass_BOOLEAN:
case typelib_TypeClass_BYTE:
- pCallStack[1] = (void*)*(char*)&nRegReturn;
+ __asm__( "ld %0, %%l0\n\t"
+ "ldsb [%%l0], %%i0\n"
+ : : "m"(&nRegReturn) );
break;
case typelib_TypeClass_CHAR:
case typelib_TypeClass_SHORT:
case typelib_TypeClass_UNSIGNED_SHORT:
- pCallStack[1] = (void*)*(short*)&nRegReturn;
+ __asm__( "ld %0, %%l0\n\t"
+ "ldsh [%%l0], %%i0\n"
+ : : "m"(&nRegReturn) );
break;
- case typelib_TypeClass_DOUBLE:
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
- // move long to %i1
- pCallStack[2] = ((void **)&nRegReturn)[ 1 ];
+
+ __asm__( "ld %0, %%l0\n\t"
+ "ld [%%l0], %%i0\n\t"
+ "ld %1, %%l0\n\t"
+ "ld [%%l0], %%i1\n\t"
+ : : "m"(&nRegReturn), "m"(((long*)&nRegReturn) +1) );
+
break;
case typelib_TypeClass_FLOAT:
+ __asm__( "ld %0, %%l0\n\t"
+ "ld [%%l0], %%f0\n"
+ : : "m"(&nRegReturn) );
+ break;
+ case typelib_TypeClass_DOUBLE:
+ __asm__( "ld %0, %%l0\n\t"
+ "ldd [%%l0], %%f0\n"
+ : : "m"(&nRegReturn) );
+ break;
+ case typelib_TypeClass_VOID:
+ break;
default:
- // move long to %i0
- pCallStack[1] = ((void **)&nRegReturn)[ 0 ];
+ __asm__( "ld %0, %%l0\n\t"
+ "ld [%%l0], %%i0\n"
+ : : "m"(&nRegReturn) );
break;
}
- return aType;
+
+ if( bComplex )
+ {
+ __asm__( "add %i7, 4, %i7\n\t" );
+ // after call to complex return valued funcion there is an unimp instruction
+ }
+
}
+
//__________________________________________________________________________________________________
-namespace {
int const codeSnippetSize = 56;
-
unsigned char * codeSnippet(
unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset,
bool simpleRetType)
{
-
sal_uInt32 index = functionIndex;
if (!simpleRetType) {
index |= 0x80000000;