You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by tr...@apache.org on 2020/08/26 22:27:35 UTC

[openoffice] branch AOO418 updated (610a398 -> a41e569)

This is an automated email from the ASF dual-hosted git repository.

truckman pushed a change to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git.


    from 610a398  Fix a compilation failure caused by missing include when debugging is enabled.
     new af84ad0  Add initial support for FreeBSD PPC using gcc.
     new 941ddfd  Update endianness detection on FreeBSD.
     new 0bd9e24  Initial support for the FreeBSD ARM platform.
     new 0879711  Some more Initial support for the FreeBSD ARM platform.
     new 2926eac  Permit using clang for FreeBSD ARM and PowerPC builds.
     new 44db7cb  freebsd-arm: obvious fix.
     new a41e569  freebsd-powerpc: obvious fix.

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../armhelper.S                                    |   0
 .../source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx    | 546 ++++++++++++++
 .../source/cpp_uno/gcc3_freebsd_arm/except.cxx     | 337 +++++++++
 .../source/cpp_uno/gcc3_freebsd_arm/makefile.mk    |  80 +++
 .../{gcc3_linux_arm => gcc3_freebsd_arm}/share.hxx |   0
 .../source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx    | 665 +++++++++++++++++
 .../cpp_uno/gcc3_freebsd_powerpc/cpp2uno.cxx       | 791 +++++++++++++++++++++
 .../except.cxx                                     |   0
 .../cpp_uno/gcc3_freebsd_powerpc/makefile.mk       |  76 ++
 .../share.hxx                                      |   0
 .../cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx       | 668 +++++++++++++++++
 .../cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx     | 718 +++++++++++++++++++
 .../except.cxx                                     |   0
 .../cpp_uno/gcc3_freebsd_powerpc64/makefile.mk     |  75 ++
 .../share.hxx                                      |   0
 .../cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx     | 596 ++++++++++++++++
 .../desktop/source/deployment/misc/dp_platform.cxx |   7 +
 main/odk/settings/platform.mk                      |   3 +
 main/odk/settings/settings.mk                      |   7 +
 main/sal/inc/osl/endian.h                          |   6 +-
 main/sal/osl/unx/system.h                          |   8 +-
 main/set_soenv.in                                  |  51 ++
 main/solenv/gbuild/platform/freebsd.mk             |  10 +
 main/solenv/inc/libs.mk                            |   3 +
 main/solenv/inc/unx.mk                             |   4 +
 main/solenv/inc/unxfbsd.mk                         |  12 +
 main/solenv/inc/unxfbsdppc.mk                      |  30 +
 main/solenv/inc/unxfbsdppc64.mk                    |  31 +
 main/solenv/inc/unxfbsdr.mk                        |  46 ++
 main/testtools/source/bridgetest/makefile.mk       |   2 +-
 30 files changed, 4763 insertions(+), 9 deletions(-)
 copy main/bridges/source/cpp_uno/{gcc3_linux_arm => gcc3_freebsd_arm}/armhelper.S (100%)
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_arm/except.cxx
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
 copy main/bridges/source/cpp_uno/{gcc3_linux_arm => gcc3_freebsd_arm}/share.hxx (100%)
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/cpp2uno.cxx
 copy main/bridges/source/cpp_uno/{gcc3_linux_powerpc64 => gcc3_freebsd_powerpc}/except.cxx (100%)
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk
 copy main/bridges/source/cpp_uno/{gcc3_macosx_powerpc => gcc3_freebsd_powerpc}/share.hxx (100%)
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx
 copy main/bridges/source/cpp_uno/{gcc3_linux_powerpc64 => gcc3_freebsd_powerpc64}/except.cxx (100%)
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
 copy main/bridges/source/cpp_uno/{gcc3_linux_powerpc64 => gcc3_freebsd_powerpc64}/share.hxx (100%)
 create mode 100644 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
 create mode 100644 main/solenv/inc/unxfbsdppc.mk
 create mode 100644 main/solenv/inc/unxfbsdppc64.mk
 create mode 100644 main/solenv/inc/unxfbsdr.mk


[openoffice] 01/07: Add initial support for FreeBSD PPC using gcc.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit af84ad07003894d5216eb168c7b513e9521cb95c
Author: Pedro Giffuni <pf...@apache.org>
AuthorDate: Sun Jul 6 16:56:22 2014 +0000

    Add initial support for FreeBSD PPC using gcc.
    
    This is just the skeleton and required bridge support based
    on linux-ppc. Currently untested.
    
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1608245 13f79535-47bb-0310-9956-ffa450edef68
---
 .../cpp_uno/gcc3_freebsd_powerpc/cpp2uno.cxx       | 791 +++++++++++++++++++++
 .../source/cpp_uno/gcc3_freebsd_powerpc/except.cxx | 283 ++++++++
 .../cpp_uno/gcc3_freebsd_powerpc/makefile.mk       |  76 ++
 .../source/cpp_uno/gcc3_freebsd_powerpc/share.hxx  |  87 +++
 .../cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx       | 668 +++++++++++++++++
 .../cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx     | 718 +++++++++++++++++++
 .../cpp_uno/gcc3_freebsd_powerpc64/except.cxx      | 283 ++++++++
 .../cpp_uno/gcc3_freebsd_powerpc64/makefile.mk     |  75 ++
 .../cpp_uno/gcc3_freebsd_powerpc64/share.hxx       |  92 +++
 .../cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx     | 596 ++++++++++++++++
 main/set_soenv.in                                  |  40 ++
 main/solenv/inc/unxfbsd.mk                         |   6 +
 main/solenv/inc/unxfbsdppc.mk                      |  30 +
 main/solenv/inc/unxfbsdppc64.mk                    |  31 +
 14 files changed, 3776 insertions(+)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/cpp2uno.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/cpp2uno.cxx
new file mode 100644
index 0000000..921f280
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/cpp2uno.cxx
@@ -0,0 +1,791 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <string.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+#include <typelib/typedescription.hxx>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+
+#include "share.hxx"
+// #include <stdio.h>
+
+
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+static typelib_TypeClass cpp2uno_call(
+	bridges::cpp_uno::shared::CppInterfaceProxy * pThis,
+	const typelib_TypeDescription * pMemberTypeDescr,
+	typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return
+	sal_Int32 nParams, typelib_MethodParameter * pParams,
+        void ** gpreg, void ** fpreg, void ** ovrflw,
+	sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+        int ng = 0; //number of gpr registers used 
+#ifndef __NO_FPRS__
+        int nf = 0; //number of fpr regsiters used
+#endif
+        void ** pCppStack; //temporary stack pointer
+       
+        // gpreg:  [ret *], this, [gpr params]
+        // fpreg:  [fpr params]
+        // ovrflw: [gpr or fpr params (properly aligned)]
+
+	// return
+	typelib_TypeDescription * pReturnTypeDescr = 0;
+	if (pReturnTypeRef)
+		TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+	
+	void * pUnoReturn = 0;
+	void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need
+	
+	if (pReturnTypeDescr)
+	{
+		if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+		{
+			pUnoReturn = pRegisterReturn; // direct way for simple types
+		}
+		else // complex return via ptr (pCppReturn)
+		{
+			pCppReturn = *(void **)gpreg;
+                        gpreg++;
+                        ng++;
+			
+			pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+						  ? alloca( pReturnTypeDescr->nSize )
+						  : pCppReturn); // direct way
+		}
+	}
+	// pop this
+        gpreg++; 
+        ng++;
+
+	// stack space
+	OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+	// parameters
+	void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
+	void ** pCppArgs = pUnoArgs + nParams;
+	// indizes of values this have to be converted (interface conversion cpp<=>uno)
+	sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+	// type descriptions for reconversions
+	typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
+	
+	sal_Int32 nTempIndizes   = 0;
+	
+	for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+	{
+		const typelib_MethodParameter & rParam = pParams[nPos];
+		typelib_TypeDescription * pParamTypeDescr = 0;
+		TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+		if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) 
+                // value
+		{
+
+			switch (pParamTypeDescr->eTypeClass)
+			{
+
+			  case typelib_TypeClass_DOUBLE:
+#ifndef __NO_FPRS__
+			   if (nf < 8) {
+			      pCppArgs[nPos] = fpreg;
+			      pUnoArgs[nPos] = fpreg;
+			      nf++;
+			      fpreg += 2;
+#else
+               if (ng & 1) {
+                   ng++;
+                   gpreg++;
+               }
+               if (ng < 8) {
+                   pCppArgs[nPos] = gpreg;
+                   pUnoArgs[nPos] = gpreg;
+                   ng += 2;
+                   gpreg += 2;
+#endif
+			   } else {
+				if (((long)ovrflw) & 4) ovrflw++;
+				pCppArgs[nPos] = ovrflw;
+				pUnoArgs[nPos] = ovrflw;
+			        ovrflw += 2;
+			   }
+			   break;
+
+			   case typelib_TypeClass_FLOAT:
+			    // fpreg are all double values so need to
+			    // modify fpreg to be a single word float value
+#ifndef __NO_FPRS__
+			    if (nf < 8) {
+			       float tmp = (float) (*((double *)fpreg));
+			       (*((float *) fpreg)) = tmp;
+			       pCppArgs[nPos] = fpreg;
+			       pUnoArgs[nPos] = fpreg;
+			       nf++;
+			       fpreg += 2;
+#else
+                if (ng < 8) {
+                   pCppArgs[nPos] = gpreg;
+                   pUnoArgs[nPos] = gpreg;
+                   ng++;
+                   gpreg++;
+#endif
+			    } else {
+#if 0 /* abi is not being followed correctly */
+			      if (((long)ovrflw) & 4) ovrflw++;
+			      float tmp = (float) (*((double *)ovrflw));
+			      (*((float *) ovrflw)) = tmp;
+			      pCppArgs[nPos] = ovrflw;
+			      pUnoArgs[nPos] = ovrflw;
+			      ovrflw += 2;
+#else
+                              pCppArgs[nPos] = ovrflw;
+			      pUnoArgs[nPos] = ovrflw;
+			      ovrflw += 1;
+#endif
+                            }
+			    break;
+
+			case typelib_TypeClass_HYPER:
+			case typelib_TypeClass_UNSIGNED_HYPER:
+			 if (ng & 1) {
+			    ng++;
+			    gpreg++;
+			 }  
+			 if (ng < 8) {
+			    pCppArgs[nPos] = gpreg;
+			    pUnoArgs[nPos] = gpreg;
+			    ng += 2;
+			    gpreg += 2;
+			 } else {
+			    if (((long)ovrflw) & 4) ovrflw++;
+			    pCppArgs[nPos] = ovrflw;
+			    pUnoArgs[nPos] = ovrflw;
+			    ovrflw += 2;
+			  }
+			  break;
+
+			case typelib_TypeClass_BYTE:
+			case typelib_TypeClass_BOOLEAN:
+			 if (ng < 8) {
+			      pCppArgs[nPos] = (((char *)gpreg) + 3);
+			      pUnoArgs[nPos] = (((char *)gpreg) + 3);
+			      ng++;
+			      gpreg++;
+			 } else {
+			      pCppArgs[nPos] = (((char *)ovrflw) + 3);
+			      pUnoArgs[nPos] = (((char *)ovrflw) + 3);
+			      ovrflw++;
+			 }
+			 break;
+
+
+		       case typelib_TypeClass_CHAR:
+		       case typelib_TypeClass_SHORT:
+		       case typelib_TypeClass_UNSIGNED_SHORT:
+			if (ng < 8) {
+			      pCppArgs[nPos] = (((char *)gpreg)+ 2);
+			      pUnoArgs[nPos] = (((char *)gpreg)+ 2);
+			      ng++;
+			      gpreg++;
+			} else {
+			      pCppArgs[nPos] = (((char *)ovrflw) + 2);
+			      pUnoArgs[nPos] = (((char *)ovrflw) + 2);
+			      ovrflw++;
+			}
+			break;
+
+
+		      default:
+			if (ng < 8) {
+			      pCppArgs[nPos] = gpreg;
+			      pUnoArgs[nPos] = gpreg;
+			      ng++;
+			      gpreg++;
+			} else {
+			      pCppArgs[nPos] = ovrflw;
+			      pUnoArgs[nPos] = ovrflw;
+			      ovrflw++;
+			}
+                        break;
+
+		        }
+		        // no longer needed
+			TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		else // ptr to complex value | ref
+		{
+
+		        if (ng < 8) { 
+		          pCppArgs[nPos] = *(void **)gpreg;
+		          pCppStack = gpreg;
+		          ng++;
+		          gpreg++;
+		        } else {
+		          pCppArgs[nPos] = *(void **)ovrflw;
+		          pCppStack = ovrflw;
+		         ovrflw++;
+		        }
+
+			if (! rParam.bIn) // is pure out
+			{
+				// uno out is unconstructed mem!
+				pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
+				pTempIndizes[nTempIndizes] = nPos;
+				// will be released at reconversion
+				ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+			}
+			// is in/inout
+			else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+			{
+				uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+										*(void **)pCppStack, pParamTypeDescr,
+										pThis->getBridge()->getCpp2Uno() );
+				pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+				// will be released at reconversion
+				ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+			}
+			else // direct way
+			{
+				pUnoArgs[nPos] = *(void **)pCppStack;
+				// no longer needed
+				TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+			}
+		}
+	}
+	
+	// ExceptionHolder
+	uno_Any aUnoExc; // Any will be constructed by callee
+	uno_Any * pUnoExc = &aUnoExc;
+
+	// invoke uno dispatch call
+	(*pThis->getUnoI()->pDispatcher)( pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+	
+	// in case an exception occurred...
+	if (pUnoExc)
+	{
+		// destruct temporary in/inout params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			
+			if (pParams[nIndex].bIn) // is in/inout => was constructed
+				uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 );
+			TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+		}
+		if (pReturnTypeDescr)
+			TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+		
+		CPPU_CURRENT_NAMESPACE::raiseException( &aUnoExc, pThis->getBridge()->getUno2Cpp() ); 
+                // has to destruct the any
+		// is here for dummy
+		return typelib_TypeClass_VOID;
+	}
+	else // else no exception occurred...
+	{
+		// temporary params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+			
+			if (pParams[nIndex].bOut) // inout/out
+			{
+				// convert and assign
+				uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+				uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr,
+										pThis->getBridge()->getUno2Cpp() );
+			}
+			// destroy temp uno param
+			uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
+			
+			TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		// return
+		if (pCppReturn) // has complex return
+		{
+			if (pUnoReturn != pCppReturn) // needs reconversion
+			{
+				uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr,
+										pThis->getBridge()->getUno2Cpp() );
+				// destroy temp uno return
+				uno_destructData( pUnoReturn, pReturnTypeDescr, 0 );
+			}
+			// complex return ptr is set to return reg
+			*(void **)pRegisterReturn = pCppReturn;
+		}
+		if (pReturnTypeDescr)
+		{
+			typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
+			TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+			return eRet;
+		}
+		else
+			return typelib_TypeClass_VOID;
+	}
+}
+
+
+//==================================================================================================
+static typelib_TypeClass cpp_mediate(
+	sal_Int32 nFunctionIndex,
+        sal_Int32 nVtableOffset,
+        void ** gpreg, void ** fpreg, void ** ovrflw,
+	sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+	OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
+	
+	// gpreg:  [ret *], this, [other gpr params]
+	// fpreg:  [fpr params]
+	// ovrflw: [gpr or fpr params (properly aligned)]
+
+        void * pThis;
+        if (nFunctionIndex & 0x80000000 )
+	{
+		nFunctionIndex &= 0x7fffffff;
+		pThis = gpreg[1];
+	}
+	else
+        {
+		pThis = gpreg[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(
+            rtl::OUString::createFromAscii("illegal vtable index!"),
+            (XInterface *)pThis );
+	}
+	
+	// determine called method
+	sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
+	OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
+
+	TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
+    
+	typelib_TypeClass eRet;
+	switch (aMemberDescr.get()->eTypeClass)
+	{
+	case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+	{
+		if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex)
+		{
+			// is GET method
+			eRet = cpp2uno_call(
+				pCppI, aMemberDescr.get(),
+				((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef,
+				0, 0, // no params
+				gpreg, fpreg, ovrflw, pRegisterReturn );
+		}
+		else
+		{
+			// is SET method
+			typelib_MethodParameter aParam;
+			aParam.pTypeRef =
+				((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef;
+			aParam.bIn		= sal_True;
+			aParam.bOut		= sal_False;
+			
+			eRet = cpp2uno_call(
+				pCppI, aMemberDescr.get(),
+				0, // indicates void return
+				1, &aParam,
+				gpreg, fpreg, ovrflw, pRegisterReturn );
+		}
+		break;
+	}
+	case typelib_TypeClass_INTERFACE_METHOD:
+	{
+		// is METHOD
+		switch (nFunctionIndex)
+		{
+		case 1: // acquire()
+			pCppI->acquireProxy(); // non virtual call!
+			eRet = typelib_TypeClass_VOID;
+			break;
+		case 2: // release()
+			pCppI->releaseProxy(); // non virtual call!
+			eRet = typelib_TypeClass_VOID;
+			break;
+		case 0: // queryInterface() opt
+		{
+			typelib_TypeDescription * pTD = 0;
+			TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( gpreg[2] )->getTypeLibType() );
+			if (pTD)
+			{
+                XInterface * pInterface = 0;
+                (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
+                    pCppI->getBridge()->getCppEnv(),
+                    (void **)&pInterface, pCppI->getOid().pData, 
+                    (typelib_InterfaceTypeDescription *)pTD );
+			
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( gpreg[0] ),
+                        &pInterface, pTD, cpp_acquire );
+                    pInterface->release();
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *(void **)pRegisterReturn = gpreg[0];
+                    eRet = typelib_TypeClass_ANY;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+			}
+		} // else perform queryInterface()
+		default:
+			eRet = cpp2uno_call(
+				pCppI, aMemberDescr.get(),
+				((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef,
+				((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams,
+				((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams,
+				gpreg, fpreg, ovrflw, pRegisterReturn );
+		}
+		break;
+	}
+	default:
+	{
+		throw RuntimeException(
+            rtl::OUString::createFromAscii("no member description found!"),
+            (XInterface *)pThis );
+		// is here for dummy
+		eRet = typelib_TypeClass_VOID;
+	}
+	}
+
+	return eRet;
+}
+
+//==================================================================================================
+/**
+ * is called on incoming vtable calls
+ * (called by asm snippets)
+ */
+static void cpp_vtable_call( int nFunctionIndex, int nVtableOffset, void** gpregptr, void** fpregptr, void** ovrflw)
+{
+        sal_Int32     gpreg[8];
+        memcpy( gpreg, gpregptr, 32);
+
+#ifndef __NO_FPRS__
+        double        fpreg[8];
+        memcpy( fpreg, fpregptr, 64);
+#endif
+
+	volatile long nRegReturn[2];
+
+        // fprintf(stderr,"in cpp_vtable_call nFunctionIndex is %x\n",nFunctionIndex);
+        // fprintf(stderr,"in cpp_vtable_call nVtableOffset is %x\n",nVtableOffset);
+        // fflush(stderr);
+
+	typelib_TypeClass aType = 
+             cpp_mediate( nFunctionIndex, nVtableOffset, (void**)gpreg,
+#ifndef __NO_FPRS__
+                 (void**)fpreg, 
+#else
+                 NULL,
+#endif
+                 ovrflw, (sal_Int64*)nRegReturn );
+    
+	switch( aType )
+	{
+
+                // move return value into register space
+                // (will be loaded by machine code snippet)
+
+                case typelib_TypeClass_BOOLEAN:
+                case typelib_TypeClass_BYTE:
+                  __asm__( "lbz 3,%0\n\t" : :
+			   "m"(nRegReturn[0]) );
+                  break;
+ 
+                case typelib_TypeClass_CHAR:
+                case typelib_TypeClass_SHORT:
+                case typelib_TypeClass_UNSIGNED_SHORT:
+                  __asm__( "lhz 3,%0\n\t" : :
+			   "m"(nRegReturn[0]) );
+                  break;
+
+		case typelib_TypeClass_FLOAT:
+#ifndef __NO_FPRS__
+                  __asm__( "lfs 1,%0\n\t" : :
+                           "m" (*((float*)nRegReturn)) );
+ #else
+                  __asm__( "lwz 3,%0\n\t" : :
+                           "m"(nRegReturn[0]) );
+#endif
+		  break;
+
+		case typelib_TypeClass_DOUBLE:
+#ifndef __NO_FPRS__
+		  __asm__( "lfd 1,%0\n\t" : :
+                           "m" (*((double*)nRegReturn)) );
+#else
+          __asm__( "lwz 3,%0\n\t" : :
+                           "m"(nRegReturn[0]) );
+          __asm__( "lwz 4,%0\n\t" : :
+                           "m"(nRegReturn[1]) );
+#endif
+		  break;
+
+		case typelib_TypeClass_HYPER:
+		case typelib_TypeClass_UNSIGNED_HYPER:
+		  __asm__( "lwz 4,%0\n\t" : :
+                           "m"(nRegReturn[1]) );  // fall through
+
+		default:
+		  __asm__( "lwz 3,%0\n\t" : :
+                           "m"(nRegReturn[0]) );
+		  break;
+	}
+}
+
+
+int const codeSnippetSize = 108;
+
+unsigned char *  codeSnippet( unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset, 
+                              bool simpleRetType)
+{
+
+  // fprintf(stderr,"in codeSnippet functionIndex is %x\n", functionIndex);
+  // fprintf(stderr,"in codeSnippet vtableOffset is %x\n", vtableOffset);
+  // fflush(stderr);
+
+    if (! simpleRetType )
+        functionIndex |= 0x80000000;
+
+    unsigned long * p = (unsigned long *) code;
+    
+    // OSL_ASSERT( sizeof (long) == 4 );
+    OSL_ASSERT((((unsigned long)code) & 0x3) == 0 );  //aligned to 4 otherwise a mistake
+
+    /* generate this code */
+    // # so first save gpr 3 to gpr 10 (aligned to 4)
+    //	stw	r3,-2048(r1)
+    //	stw	r4,-2044(r1)
+    //	stw	r5,-2040(r1)
+    //	stw	r6,-2036(r1)
+    //	stw	r7,-2032(r1)
+    //	stw	r8,-2028(r1)
+    //	stw	r9,-2024(r1)
+    //	stw	r10,-2020(r1)
+
+
+    // # next save fpr 1 to fpr 8 (aligned to 8)
+    // if dedicated floating point registers are used
+    //	stfd	f1,-2016(r1)
+    //	stfd	f2,-2008(r1)
+    //	stfd	f3,-2000(r1)
+    //	stfd	f4,-1992(r1)
+    //	stfd	f5,-1984(r1)
+    //	stfd	f6,-1976(r1)
+    //	stfd	f7,-1968(r1)
+    //	stfd	f8,-1960(r1)
+
+    // # now here is where cpp_vtable_call must go
+    //	lis	r3,-8531
+    //	ori	r3,r3,48879
+    //	mtctr	r3
+
+    // # now load up the functionIndex
+    //	lis	r3,-8531
+    //	ori	r3,r3,48879
+
+    // # now load up the vtableOffset 
+    //	lis	r4,-8531
+    //	ori	r4,r4,48879
+
+    // #now load up the pointer to the saved gpr registers
+    //	addi	r5,r1,-2048
+
+    // #now load up the pointer to the saved fpr registers
+    //	addi	r6,r1,-2016
+    // if no dedicated floating point registers are used than we have NULL
+    // pointer there
+    //  li      r6, 0
+    //
+
+    // #now load up the pointer to the overflow call stack
+    //	addi	r7,r1,8
+    //	bctr
+
+      * p++ = 0x9061f800;
+      * p++ = 0x9081f804;
+      * p++ = 0x90a1f808;
+      * p++ = 0x90c1f80c;
+      * p++ = 0x90e1f810;
+      * p++ = 0x9101f814;
+      * p++ = 0x9121f818;
+      * p++ = 0x9141f81c;
+#ifndef __NO_FPRS__
+      * p++ = 0xd821f820;
+      * p++ = 0xd841f828;
+      * p++ = 0xd861f830;
+      * p++ = 0xd881f838;
+      * p++ = 0xd8a1f840;
+      * p++ = 0xd8c1f848;
+      * p++ = 0xd8e1f850;
+      * p++ = 0xd901f858;
+#else
+      /* these nops could be replaced with a smaller codeSnippetSize - 8 * 4 */
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+      * p++ = 0x60000000;
+#endif
+      * p++ = 0x3c600000 | (((unsigned long)cpp_vtable_call) >> 16);
+      * p++ = 0x60630000 | (((unsigned long)cpp_vtable_call) & 0x0000FFFF);
+      * p++ = 0x7c6903a6;
+      * p++ = 0x3c600000 | (((unsigned long)functionIndex) >> 16);
+      * p++ = 0x60630000 | (((unsigned long)functionIndex) & 0x0000FFFF);
+      * p++ = 0x3c800000 | (((unsigned long)vtableOffset) >> 16);
+      * p++ = 0x60840000 | (((unsigned long)vtableOffset) & 0x0000FFFF);
+      * p++ = 0x38a1f800;
+#ifndef __NO_FPRS__
+      * p++ = 0x38c1f820;
+#else
+      * p++ = 0x38c00000;
+#endif
+      * p++ = 0x38e10008;
+      * p++ = 0x4e800420;
+      return (code + codeSnippetSize);
+
+}
+
+
+}
+
+void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const * bptr, unsigned char const * eptr)
+{
+    int const lineSize = 32;
+    for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+        __asm__ volatile ("dcbst 0, %0" : : "r"(p) : "memory");
+    }
+    __asm__ volatile ("sync" : : : "memory");
+    for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+        __asm__ volatile ("icbi 0, %0" : : "r"(p) : "memory");
+    }
+    __asm__ volatile ("isync" : : : "memory");
+}
+
+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+{
+    return static_cast< Slot * >(block) + 2;
+}
+
+sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+    sal_Int32 slotCount)
+{
+    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+}
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::initializeBlock(
+    void * block, sal_Int32 slotCount)
+{
+    Slot * slots = mapBlockToVtable(block);
+    slots[-2].fn = 0;
+    slots[-1].fn = 0;
+    return slots + slotCount;
+}
+
+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+    Slot ** slots, unsigned char * code, sal_PtrDiff writetoexecdiff,
+    typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+    sal_Int32 functionCount, sal_Int32 vtableOffset)
+{
+     (*slots) -= functionCount;
+     Slot * s = *slots;
+  // fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
+  // fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
+  // fflush(stderr);
+
+    for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+        typelib_TypeDescription * member = 0;
+        TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+        OSL_ASSERT(member != 0);
+        switch (member->eTypeClass) {
+        case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+            // Getter:
+            (s++)->fn = code + writetoexecdiff;
+            code = codeSnippet(
+                code, functionOffset++, vtableOffset,
+                bridges::cpp_uno::shared::isSimpleType(
+                    reinterpret_cast<
+                    typelib_InterfaceAttributeTypeDescription * >(
+                        member)->pAttributeTypeRef));
+
+            // Setter:
+            if (!reinterpret_cast<
+                typelib_InterfaceAttributeTypeDescription * >(
+                    member)->bReadOnly)
+            {
+                (s++)->fn = code + writetoexecdiff;
+                code = codeSnippet(code, functionOffset++, vtableOffset, true);
+            }
+            break;
+
+        case typelib_TypeClass_INTERFACE_METHOD:
+            (s++)->fn = code + writetoexecdiff;
+            code = codeSnippet(
+                code, functionOffset++, vtableOffset,
+                bridges::cpp_uno::shared::isSimpleType(
+                    reinterpret_cast<
+                    typelib_InterfaceMethodTypeDescription * >(
+                        member)->pReturnTypeRef));
+            break;
+
+        default:
+            OSL_ASSERT(false);
+            break;
+        }
+        TYPELIB_DANGER_RELEASE(member);
+    }
+    return code;
+}
+
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/except.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/except.cxx
new file mode 100644
index 0000000..c0b6856
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/except.cxx
@@ -0,0 +1,283 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <stdio.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <cxxabi.h>
+#include <hash_map>
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <osl/diagnose.h>
+#include <osl/mutex.hxx>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <typelib/typedescription.hxx>
+#include <uno/any2.h>
+
+#include "share.hxx"
+
+
+using namespace ::std;
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+using namespace ::__cxxabiv1;
+
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+void dummy_can_throw_anything( char const * )
+{
+}
+
+//==================================================================================================
+static OUString toUNOname( char const * p ) SAL_THROW( () )
+{
+#if OSL_DEBUG_LEVEL > 1
+    char const * start = p;
+#endif
+
+    // example: N3com3sun4star4lang24IllegalArgumentExceptionE
+
+	OUStringBuffer buf( 64 );
+    OSL_ASSERT( 'N' == *p );
+    ++p; // skip N
+
+    while ('E' != *p)
+    {
+        // read chars count
+        long n = (*p++ - '0');
+        while ('0' <= *p && '9' >= *p)
+        {
+            n *= 10;
+            n += (*p++ - '0');
+        }
+        buf.appendAscii( p, n );
+        p += n;
+        if ('E' != *p)
+            buf.append( (sal_Unicode)'.' );
+    }
+
+#if OSL_DEBUG_LEVEL > 1
+    OUString ret( buf.makeStringAndClear() );
+    OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
+    fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
+    return ret;
+#else
+    return buf.makeStringAndClear();
+#endif
+}
+
+//==================================================================================================
+class RTTI
+{
+    typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map;
+
+    Mutex m_mutex;
+	t_rtti_map m_rttis;
+    t_rtti_map m_generatedRttis;
+
+    void * m_hApp;
+
+public:
+    RTTI() SAL_THROW( () );
+    ~RTTI() SAL_THROW( () );
+
+    type_info * getRTTI( typelib_CompoundTypeDescription * ) SAL_THROW( () );
+};
+//__________________________________________________________________________________________________
+RTTI::RTTI() SAL_THROW( () )
+    : m_hApp( dlopen( 0, RTLD_LAZY ) )
+{
+}
+//__________________________________________________________________________________________________
+RTTI::~RTTI() SAL_THROW( () )
+{
+    dlclose( m_hApp );
+}
+
+//__________________________________________________________________________________________________
+type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () )
+{
+    type_info * rtti;
+
+    OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName;
+
+    MutexGuard guard( m_mutex );
+    t_rtti_map::const_iterator iRttiFind( m_rttis.find( unoName ) );
+    if (iRttiFind == m_rttis.end())
+    {
+        // RTTI symbol
+        OStringBuffer buf( 64 );
+        buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") );
+        sal_Int32 index = 0;
+        do
+        {
+            OUString token( unoName.getToken( 0, '.', index ) );
+            buf.append( token.getLength() );
+            OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) );
+            buf.append( c_token );
+        }
+        while (index >= 0);
+        buf.append( 'E' );
+
+        OString symName( buf.makeStringAndClear() );
+        rtti = (type_info *)dlsym( m_hApp, symName.getStr() );
+
+        if (rtti)
+        {
+            pair< t_rtti_map::iterator, bool > insertion(
+                m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+            OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" );
+        }
+        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())
+            {
+                // we must generate it !
+                // symbol and rtti-name is nearly identical,
+                // the symbol is prefixed with _ZTI
+                char const * rttiName = symName.getStr() +4;
+#if OSL_DEBUG_LEVEL > 1
+                fprintf( stderr,"generated rtti for %s\n", rttiName );
+#endif
+                if (pTypeDescr->pBaseTypeDescription)
+                {
+                    // ensure availability of base
+                    type_info * base_rtti = getRTTI(
+                        (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription );
+                    rtti = new __si_class_type_info(
+                        strdup( rttiName ), (__class_type_info *)base_rtti );
+                }
+                else
+                {
+                    // this class has no base class
+                    rtti = new __class_type_info( strdup( rttiName ) );
+                }
+
+                pair< t_rtti_map::iterator, bool > insertion(
+                    m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+                OSL_ENSURE( insertion.second, "### inserting new generated rtti failed?!" );
+            }
+            else // taking already generated rtti
+            {
+                rtti = iFind->second;
+            }
+        }
+    }
+    else
+    {
+        rtti = iRttiFind->second;
+    }
+
+    return rtti;
+}
+
+//--------------------------------------------------------------------------------------------------
+static void deleteException( void * pExc )
+{
+    __cxa_exception const * header = ((__cxa_exception const *)pExc - 1);
+    typelib_TypeDescription * pTD = 0;
+    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    ::typelib_typedescription_getByName( &pTD, unoName.pData );
+    OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" );
+    if (pTD)
+    {
+		::uno_destructData( pExc, pTD, cpp_release );
+		::typelib_typedescription_release( pTD );
+	}
+}
+
+//==================================================================================================
+void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
+{
+    void * pCppExc;
+    type_info * rtti;
+
+    {
+    // construct cpp exception object
+	typelib_TypeDescription * pTypeDescr = 0;
+	TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
+    OSL_ASSERT( pTypeDescr );
+    if (! pTypeDescr)
+        terminate();
+
+	pCppExc = __cxa_allocate_exception( pTypeDescr->nSize );
+	::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
+
+	// destruct uno exception
+	::uno_any_destruct( pUnoExc, 0 );
+    // avoiding locked counts
+    static RTTI * s_rtti = 0;
+    if (! s_rtti)
+    {
+        MutexGuard guard( Mutex::getGlobalMutex() );
+        if (! s_rtti)
+        {
+#ifdef LEAK_STATIC_DATA
+            s_rtti = new RTTI();
+#else
+            static RTTI rtti_data;
+            s_rtti = &rtti_data;
+#endif
+        }
+    }
+	rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr );
+    TYPELIB_DANGER_RELEASE( pTypeDescr );
+    OSL_ENSURE( rtti, "### no rtti for throwing exception!" );
+    if (! rtti)
+        terminate();
+    }
+
+	__cxa_throw( pCppExc, rtti, deleteException );
+}
+
+//==================================================================================================
+void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+{
+    OSL_ENSURE( header, "### no exception header!!!" );
+    if (! header)
+        terminate();
+
+	typelib_TypeDescription * pExcTypeDescr = 0;
+    OUString unoName( toUNOname( header->exceptionType->name() ) );
+	::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
+    OSL_ENSURE( pExcTypeDescr, "### can not get type description for exception!!!" );
+    if (! pExcTypeDescr)
+        terminate();
+
+    // construct uno exception any
+    ::uno_any_constructAndConvert( pExc, header->adjustedPtr, pExcTypeDescr, pCpp2Uno );
+    ::typelib_typedescription_release( pExcTypeDescr );
+}
+
+}
+
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk
new file mode 100644
index 0000000..0f05903
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk
@@ -0,0 +1,76 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+PRJ=..$/..$/..
+
+PRJNAME=bridges
+TARGET=gcc3_uno
+LIBTARGET=no
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE :  settings.mk
+
+# --- Files --------------------------------------------------------
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "GCCLINUXPgcc3POWERPC"
+
+.IF "$(cppu_no_leak)" == ""
+CFLAGS += -DLEAK_STATIC_DATA
+.ENDIF
+
+# In case someone enabled the non-standard -fomit-frame-pointer which does not
+# work with the .cxx sources in this directory:
+CFLAGSCXX += -fno-omit-frame-pointer
+
+NOOPTFILES= \
+	$(SLO)$/uno2cpp.obj
+
+
+CFLAGSNOOPT=-O0
+
+SLOFILES= \
+	$(SLO)$/except.obj		\
+	$(SLO)$/cpp2uno.obj		\
+	$(SLO)$/uno2cpp.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1IMPLIB=i$(TARGET)
+SHL1VERSIONMAP=..$/..$/bridge_exports.map
+SHL1RPATH=URELIB
+
+SHL1OBJS= $(SLOFILES)
+SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
+
+SHL1STDLIBS= \
+	$(CPPULIB)			\
+	$(SALLIB)
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :  target.mk
+
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/share.hxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/share.hxx
new file mode 100644
index 0000000..0f0e577
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/share.hxx
@@ -0,0 +1,87 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+#include "uno/mapping.h"
+
+#include <typeinfo>
+#include <exception>
+#include <cstddef>
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+  void dummy_can_throw_anything( char const * );
+
+
+// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
+
+struct _Unwind_Exception
+{
+    unsigned exception_class __attribute__((__mode__(__DI__)));
+    void * exception_cleanup;
+    unsigned private_1 __attribute__((__mode__(__word__)));
+    unsigned private_2 __attribute__((__mode__(__word__)));
+} __attribute__((__aligned__));
+
+struct __cxa_exception
+{ 
+    ::std::type_info *exceptionType;
+    void (*exceptionDestructor)(void *); 
+    
+    ::std::unexpected_handler unexpectedHandler;
+    ::std::terminate_handler terminateHandler;
+    
+    __cxa_exception *nextException;
+    
+    int handlerCount;
+    
+    int handlerSwitchValue;
+    const unsigned char *actionRecord;
+    const unsigned char *languageSpecificData;
+    void *catchTemp;
+    void *adjustedPtr;
+    
+    _Unwind_Exception unwindHeader;
+};    
+
+extern "C" void *__cxa_allocate_exception(
+    std::size_t thrown_size ) throw();
+extern "C" void __cxa_throw (
+    void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn));
+
+struct __cxa_eh_globals
+{
+    __cxa_exception *caughtExceptions;
+    unsigned int uncaughtExceptions;
+};
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+
+// -----
+
+//==================================================================================================
+void raiseException(
+    uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
+//==================================================================================================
+void fillUnoException(
+    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+}
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx
new file mode 100644
index 0000000..c43b07b
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx
@@ -0,0 +1,668 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <malloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/vtables.hxx"
+
+#include "share.hxx"
+
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+
+//==================================================================================================
+static void callVirtualMethod(
+    void * pAdjustedThisPtr,
+    sal_Int32 nVtableIndex,
+    void * pRegisterReturn,
+    typelib_TypeClass eReturnType,
+    char * pPT,
+    sal_Int32 * pStackLongs,
+    sal_Int32 nStackLongs)
+{
+
+  // parameter list is mixed list of * and values
+  // reference parameters are pointers
+
+  // the basic idea here is to use gpr[8] as a storage area for
+  // the future values of registers r3 to r10 needed for the call, 
+  // and similarly fpr[8] as a storage area for the future values
+  // of floating point registers f1 to f8
+
+     unsigned long * mfunc;        // actual function to be invoked
+     void (*ptr)();
+     int gpr[8];                   // storage for gpregisters, map to r3-r10
+     int off;                      // offset used to find function
+#ifndef __NO_FPRS__
+     double fpr[8];                // storage for fpregisters, map to f1-f8
+     int f;                        // number of fprs mapped so far
+     double dret;                  // temporary function return values
+#endif
+     int n;                        // number of gprs mapped so far
+     long *p;                      // pointer to parameter overflow area
+     int c;                        // character of parameter type being decoded
+     int iret, iret2;
+
+     // Because of the Power PC calling conventions we could be passing
+     // parameters in both register types and on the stack. To create the
+     // stack parameter area we need we now simply allocate local
+     // variable storage param[] that is at least the size of the parameter stack
+     // (more than enough space) which we can overwrite the parameters into.
+
+     // Note: This keeps us from having to decode the signature twice and
+     // prevents problems with later local variables.
+
+     // Note: could require up to  2*nStackLongs words of parameter stack area 
+     // if the call has many float parameters (i.e. floats take up only 1 
+     // word on the stack but double takes 2 words in parameter area in the
+     // stack frame .
+
+     // Update! floats on the outgoing parameter stack only take up 1 word
+     // (stfs is used) which is not correct according to the ABI but we
+     // will match what the compiler does until this is figured out 
+
+     // this grows the current stack to the appropriate size
+     // and sets the outgoing stack pointer p to the right place
+     __asm__ __volatile__ (
+          "rlwinm %0,%0,3,3,28\n\t"
+          "addi %0,%0,22\n\t"
+          "rlwinm %0,%0,0,4,28\n\t"
+          "lwz 0,0(1)\n\t"
+          "subf 1,%0,1\n\t"
+          "stw 0,0(1)\n\t"
+          : : "r" (nStackLongs) : "0" );
+
+     __asm__ __volatile__ ( "addi %0,1,8" : "=r" (p) : );
+
+     // never called
+     // if (! pAdjustedThisPtr ) dummy_can_throw_anything("xxx"); // address something
+
+
+     // now begin to load the C++ function arguments into storage
+     n = 0;
+#ifndef __NO_FPRS__
+     f = 0;
+#endif
+
+     // now we need to parse the entire signature string */
+     // until we get the END indicator */
+
+     // treat complex return pointer like any other parameter //
+
+#if 0
+     /* Let's figure out what is really going on here*/
+     fprintf(stderr,"callVirtualMethod parameters string is %s\n",pPT);
+     int k = nStackLongs;
+     long * q = (long *)pStackLongs;
+     while (k > 0) {
+       fprintf(stderr,"uno stack is: %x\n",*q);
+       k--;
+       q++;
+     }
+#endif
+
+     /* parse the argument list up to the ending ) */
+     while (*pPT != 'X') {
+       c = *pPT;
+       switch (c) {
+       case 'D':                   /* type is double */
+#ifndef __NO_FPRS__
+            if (f < 8) {
+               fpr[f++] = *((double *)pStackLongs);   /* store in register */
+#else
+            if (n & 1)
+               n++;
+            if (n < 8) {
+               gpr[n++] = *pStackLongs;
+               gpr[n++] = *(pStackLongs+1);
+#endif
+	    } else {
+	       if (((long) p) & 4)          
+	          p++;
+               *p++ = *pStackLongs;       /* or on the parameter stack */
+               *p++ = *(pStackLongs + 1);
+	    }
+            pStackLongs += 2;
+            break;
+
+       case 'F':                   /* type is float */
+	 /* this assumes that floats are stored as 1 32 bit word on param
+	    stack and that if passed in parameter stack to C, should be
+	    as double word.
+
+            Whoops: the abi is not actually followed by gcc, need to 
+            store floats as a *single* word on outgoing parameter stack
+            to match what gcc actually does
+	 */
+#ifndef __NO_FPRS__
+            if (f < 8) {
+               fpr[f++] = *((float *)pStackLongs);
+#else
+            if (n < 8) {
+               gpr[n++] = *pStackLongs;
+#endif
+	    } else {
+#if 0 /* if abi were followed */
+	       if (((long) p) & 4)          
+	          p++;
+	       *((double *)p) = *((float *)pStackLongs);
+               p += 2;
+#else
+	       *((float *)p) = *((float *)pStackLongs);
+               p += 1;
+#endif
+	    }
+            pStackLongs += 1;
+            break;
+
+       case 'H':                /* type is long long */
+            if (n & 1) n++; 	/* note even elements gpr[] will map to
+                                   odd registers*/
+            if (n <= 6) {
+               gpr[n++] = *pStackLongs;
+               gpr[n++] = *(pStackLongs+1);
+	    } else {
+	       if (((long) p) & 4)          
+	          p++;
+               *p++ = *pStackLongs;
+               *p++ = *(pStackLongs+1);
+	    }
+            pStackLongs += 2;
+            break;
+
+       case 'S':
+            if (n < 8) {
+               gpr[n++] = *((unsigned short*)pStackLongs);
+	    } else {
+               *p++ = *((unsigned short *)pStackLongs);
+	    }
+            pStackLongs += 1;
+            break;
+
+       case 'B':
+            if (n < 8) {
+               gpr[n++] = *((char *)pStackLongs);
+	    } else {
+               *p++ = *((char *)pStackLongs);
+	    }
+            pStackLongs += 1;
+            break;
+
+       default:
+            if (n < 8) {
+               gpr[n++] = *pStackLongs;
+	    } else {
+               *p++ = *pStackLongs;
+	    }
+            pStackLongs += 1;
+            break;
+       }
+       pPT++;
+     }
+
+     /* figure out the address of the function we need to invoke */
+     off = nVtableIndex; 
+     off = off * 4;                         // 4 bytes per slot
+     mfunc = *((unsigned long **)pAdjustedThisPtr);    // get the address of the vtable
+     mfunc = (unsigned long *)((char *)mfunc + off); // get the address from the vtable entry at offset 
+     mfunc = *((unsigned long **)mfunc);                 // the function is stored at the address
+     ptr = (void (*)())mfunc;   
+
+    /* Set up the machine registers and invoke the function */
+
+    __asm__ __volatile__ (
+		"lwz	3,	0(%0)\n\t"
+		"lwz	4,	4(%0)\n\t"
+		"lwz	5,	8(%0)\n\t"
+		"lwz	6,	12(%0)\n\t"
+		"lwz	7,	16(%0)\n\t"
+		"lwz	8,	20(%0)\n\t"
+		"lwz	9,	24(%0)\n\t"
+		"lwz	10,	28(%0)\n\t"
+#ifndef __NO_FPRS__
+		"lfd	1,	0(%1)\n\t"
+		"lfd	2,	8(%1)\n\t"
+		"lfd	3,	16(%1)\n\t"
+		"lfd	4,	24(%1)\n\t"
+		"lfd	5,	32(%1)\n\t"
+		"lfd	6,	40(%1)\n\t"
+		"lfd	7,	48(%1)\n\t"
+		"lfd	8,	56(%1)\n\t"
+	        : : "r" (gpr), "r" (fpr)
+#else
+	        : : "r" (gpr)
+#endif
+		: "0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
+    );
+
+    (*ptr)();
+
+    __asm__ __volatile__ (
+       "mr     %0,     3\n\t"
+       "mr     %1,     4\n\t"
+#ifndef __NO_FPRS__
+       "fmr    %2,     1\n\t"
+       : "=r" (iret), "=r" (iret2), "=f" (dret)
+#else
+       : "=r" (iret), "=r" (iret2)
+#endif
+       : );
+
+    switch( eReturnType )
+	{
+		case typelib_TypeClass_HYPER:
+		case typelib_TypeClass_UNSIGNED_HYPER:
+		        ((long*)pRegisterReturn)[0] = iret;
+			((long*)pRegisterReturn)[1] = iret2;
+		case typelib_TypeClass_LONG:
+		case typelib_TypeClass_UNSIGNED_LONG:
+		case typelib_TypeClass_ENUM:
+			((long*)pRegisterReturn)[0] = iret;
+			break;
+		case typelib_TypeClass_CHAR:
+		case typelib_TypeClass_SHORT:
+		case typelib_TypeClass_UNSIGNED_SHORT:
+		        *(unsigned short*)pRegisterReturn = (unsigned short)iret;
+			break;
+		case typelib_TypeClass_BOOLEAN:
+		case typelib_TypeClass_BYTE:
+		        *(unsigned char*)pRegisterReturn = (unsigned char)iret;
+			break;
+		case typelib_TypeClass_FLOAT:
+#ifndef __NO_FPRS__
+		        *(float*)pRegisterReturn = (float)dret;
+#else
+		        ((unsigned int*)pRegisterReturn)[0] = iret;
+#endif
+			break;
+		case typelib_TypeClass_DOUBLE:
+#ifndef __NO_FPRS__
+			*(double*)pRegisterReturn = dret;
+#else
+			((unsigned int*)pRegisterReturn)[0] = iret;
+			((unsigned int*)pRegisterReturn)[1] = iret2;
+#endif
+			break;
+		default:
+			break;
+	}
+}
+
+
+//================================================================================================== 
+static void cpp_call(
+	bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+	bridges::cpp_uno::shared::VtableSlot  aVtableSlot,
+	typelib_TypeDescriptionReference * pReturnTypeRef,
+	sal_Int32 nParams, typelib_MethodParameter * pParams,
+	void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
+{
+  	// max space for: [complex ret ptr], values|ptr ...
+  	char * pCppStack		=
+  		(char *)alloca( sizeof(sal_Int32) + ((nParams+2) * sizeof(sal_Int64)) );
+  	char * pCppStackStart	= pCppStack;
+	
+        // need to know parameter types for callVirtualMethod so generate a signature string
+        char * pParamType = (char *) alloca(nParams+2);
+        char * pPT = pParamType;
+
+	// 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
+	
+	if (pReturnTypeDescr)
+	{
+		if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+		{
+			pCppReturn = pUnoReturn; // direct way for simple types
+		}
+		else
+		{
+			// complex return via ptr
+			pCppReturn = *(void **)pCppStack = 
+                              (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+			       ? alloca( pReturnTypeDescr->nSize ): pUnoReturn); // direct way
+                        *pPT++ = 'I'; //signify that a complex return type on stack
+			pCppStack += sizeof(void *);
+		}
+	}
+	// push this
+        void* pAdjustedThisPtr = reinterpret_cast< void **>(pThis->getCppI()) + aVtableSlot.offset;
+	*(void**)pCppStack = pAdjustedThisPtr;
+	pCppStack += sizeof( void* );
+        *pPT++ = 'I';
+
+	// stack space
+	// OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+	// args
+	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;
+	
+	for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+	{
+		const typelib_MethodParameter & rParam = pParams[nPos];
+		typelib_TypeDescription * pParamTypeDescr = 0;
+		TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+		
+		if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+		{
+			uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, 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 - int, long, pointer, etc means pass 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 long int pass in proper pairs of gpr (3,4) (5,6), etc
+                          //      X - indicates end of parameter description string
+
+		          case typelib_TypeClass_LONG:
+		          case typelib_TypeClass_UNSIGNED_LONG:
+		          case typelib_TypeClass_ENUM:
+			    *pPT++ = 'I';
+			    break;
+ 		          case typelib_TypeClass_SHORT:
+		          case typelib_TypeClass_CHAR:
+		          case typelib_TypeClass_UNSIGNED_SHORT:
+                            *pPT++ = 'S';
+                            break;
+		          case typelib_TypeClass_BOOLEAN:
+		          case typelib_TypeClass_BYTE:
+                            *pPT++ = 'B';
+                            break;
+		          case typelib_TypeClass_FLOAT:
+                            *pPT++ = 'F';
+			    break;
+		        case typelib_TypeClass_DOUBLE:
+			    *pPT++ = 'D';
+			    pCppStack += sizeof(sal_Int32); // extra long
+			    break;
+			case typelib_TypeClass_HYPER:
+			case typelib_TypeClass_UNSIGNED_HYPER:
+			    *pPT++ = 'H';
+			    pCppStack += sizeof(sal_Int32); // extra long
+			default:
+			    break;
+			}
+
+			// no longer needed
+			TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		else // ptr to complex value | ref
+		{
+			if (! rParam.bIn) // is pure out
+			{
+				// cpp out is constructed mem, uno out is not!
+				uno_constructData(
+					*(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+					pParamTypeDescr );
+				pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+				// will be released at reconversion
+				ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+			}
+			// is in/inout
+			else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+			{
+				uno_copyAndConvertData(
+					*(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+					pUnoArgs[nPos], pParamTypeDescr, 
+                                        pThis->getBridge()->getUno2Cpp() );
+				
+				pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+				// will be released at reconversion
+				ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+			}
+			else // direct way
+			{
+				*(void **)pCppStack = pCppArgs[nPos] = pUnoArgs[nPos];
+				// no longer needed
+				TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+			}
+                        // KBH: FIXME: is this the right way to pass these
+                        *pPT++='I';
+		}
+		pCppStack += sizeof(sal_Int32); // standard parameter length
+	}
+  
+        // terminate the signature string
+        *pPT++='X';
+        *pPT=0;
+
+	try
+	{
+		OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 3), "UNALIGNED STACK !!! (Please DO panic)" );
+		callVirtualMethod(
+			pAdjustedThisPtr, aVtableSlot.index,
+			pCppReturn, pReturnTypeDescr->eTypeClass, pParamType,
+			(sal_Int32 *)pCppStackStart, (pCppStack - pCppStackStart) / sizeof(sal_Int32) );
+		// NO exception occurred...
+		*ppUnoExc = 0;
+		
+		// reconvert temporary params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+			
+			if (pParams[nIndex].bIn)
+			{
+				if (pParams[nIndex].bOut) // inout
+				{
+					uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value
+					uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+											pThis->getBridge()->getCpp2Uno() );
+				}
+			}
+			else // pure out
+			{
+				uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+										pThis->getBridge()->getCpp2Uno() );
+			}
+			// destroy temp cpp param => cpp: every param was constructed
+			uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+			
+			TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		// return value
+		if (pCppReturn && pUnoReturn != pCppReturn)
+		{
+			uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr,
+									pThis->getBridge()->getCpp2Uno() );
+			uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
+		}
+	}
+ 	catch (...)
+ 	{
+  		// fill uno exception
+		fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, 
+                                  *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        
+		// temporary params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			// destroy temp cpp param => cpp: every param was constructed
+			uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release );
+			TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+		}
+		// return type
+		if (pReturnTypeDescr)
+			TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+	}
+}
+
+}
+
+namespace bridges { namespace cpp_uno { namespace shared {
+
+void unoInterfaceProxyDispatch(
+	uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
+	void * pReturn, void * pArgs[], uno_Any ** ppException )
+{
+	// is my surrogate
+        bridges::cpp_uno::shared::UnoInterfaceProxy * pThis 
+            = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
+	
+	switch (pMemberDescr->eTypeClass)
+	{
+	case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+	{
+
+        VtableSlot aVtableSlot(
+            getVtableSlot(
+                reinterpret_cast<
+                    typelib_InterfaceAttributeTypeDescription const * >(
+                        pMemberDescr)));
+
+		if (pReturn)
+		{
+			// dependent dispatch
+			cpp_call(
+				pThis, aVtableSlot,
+				((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef,
+				0, 0, // no params
+				pReturn, pArgs, ppException );
+		}
+		else
+		{
+			// is SET
+			typelib_MethodParameter aParam;
+			aParam.pTypeRef =
+				((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef;
+			aParam.bIn		= sal_True;
+			aParam.bOut		= sal_False;
+
+			typelib_TypeDescriptionReference * pReturnTypeRef = 0;
+			OUString aVoidName( RTL_CONSTASCII_USTRINGPARAM("void") );
+			typelib_typedescriptionreference_new(
+				&pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
+			
+			// dependent dispatch
+                        aVtableSlot.index += 1; //get then set method
+			cpp_call(
+				pThis, aVtableSlot,
+				pReturnTypeRef,
+				1, &aParam,
+				pReturn, pArgs, ppException );
+			
+			typelib_typedescriptionreference_release( pReturnTypeRef );
+		}
+		
+		break;
+	}
+	case typelib_TypeClass_INTERFACE_METHOD:
+	{
+
+        VtableSlot aVtableSlot(
+            getVtableSlot(
+                reinterpret_cast<
+                    typelib_InterfaceMethodTypeDescription const * >(
+                        pMemberDescr)));
+		switch (aVtableSlot.index)
+		{
+			// standard calls
+		case 1: // acquire uno interface
+			(*pUnoI->acquire)( pUnoI );
+			*ppException = 0;
+			break;
+		case 2: // release uno interface
+			(*pUnoI->release)( pUnoI );
+			*ppException = 0;
+			break;
+		case 0: // queryInterface() opt
+		{
+			typelib_TypeDescription * pTD = 0;
+			TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() );
+			if (pTD)
+			{
+                uno_Interface * pInterface = 0;
+                (*pThis->pBridge->getUnoEnv()->getRegisteredInterface)(
+                    pThis->pBridge->getUnoEnv(),
+                    (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD );
+			
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( pReturn ),
+                        &pInterface, pTD, 0 );
+                    (*pInterface->release)( pInterface );
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *ppException = 0;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+            }
+		} // else perform queryInterface()
+		default:
+			// dependent dispatch
+			cpp_call(
+				pThis, aVtableSlot,
+				((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef,
+				((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams,
+				((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams,
+				pReturn, pArgs, ppException );
+		}
+		break;
+	}
+	default:
+	{
+		::com::sun::star::uno::RuntimeException aExc(
+			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal member type description!") ),
+			::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() );
+		
+		Type const & rExcType = ::getCppuType( &aExc );
+		// binary identical null reference
+		::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 );
+	}
+	}
+}
+
+} } }
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx
new file mode 100644
index 0000000..ca96db0
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/cpp2uno.cxx
@@ -0,0 +1,718 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+#include <typelib/typedescription.hxx>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+
+#include "share.hxx"
+#include <stdio.h>
+#include <string.h>
+
+
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+static typelib_TypeClass cpp2uno_call(
+	bridges::cpp_uno::shared::CppInterfaceProxy * pThis,
+	const typelib_TypeDescription * pMemberTypeDescr,
+	typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return
+	sal_Int32 nParams, typelib_MethodParameter * pParams,
+        void ** gpreg, void ** fpreg, void ** ovrflw,
+	sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+#ifdef CMC_DEBUG
+    fprintf(stderr, "as far as cpp2uno_call\n");
+#endif
+
+    int ng = 0; //number of gpr registers used 
+    int nf = 0; //number of fpr regsiters used
+       
+    // gpreg:  [ret *], this, [gpr params]
+    // fpreg:  [fpr params]
+    // ovrflw: [gpr or fpr params (properly aligned)]
+
+	// return
+	typelib_TypeDescription * pReturnTypeDescr = 0;
+	if (pReturnTypeRef)
+		TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+	
+	void * pUnoReturn = 0;
+	void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need
+	
+	if (pReturnTypeDescr)
+	{
+		if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+		{
+			pUnoReturn = pRegisterReturn; // direct way for simple types
+		}
+		else // complex return via ptr (pCppReturn)
+		{
+			pCppReturn = *(void **)gpreg;
+            gpreg++;
+            ng++;
+			
+			pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+						  ? alloca( pReturnTypeDescr->nSize )
+						  : pCppReturn); // direct way
+		}
+	}
+	// pop this
+    gpreg++; 
+    ng++;
+
+	// stack space
+	OSL_ENSURE( sizeof(void *) == sizeof(sal_Int64), "### unexpected size!" );
+	// parameters
+	void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
+	void ** pCppArgs = pUnoArgs + nParams;
+	// indizes of values this have to be converted (interface conversion cpp<=>uno)
+	sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+	// type descriptions for reconversions
+	typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
+	
+	sal_Int32 nTempIndizes = 0;
+	bool bOverFlowUsed = false;
+	for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+	{
+		const typelib_MethodParameter & rParam = pParams[nPos];
+		typelib_TypeDescription * pParamTypeDescr = 0;
+		TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+#ifdef CMC_DEBUG
+		fprintf(stderr, "arg %d of %d\n", nPos, nParams);
+#endif
+
+		if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) 
+		{
+#ifdef CMC_DEBUG
+			fprintf(stderr, "simple\n");
+#endif
+
+			switch (pParamTypeDescr->eTypeClass)
+			{
+				case typelib_TypeClass_FLOAT:
+				case typelib_TypeClass_DOUBLE:
+					if (nf < ppc64::MAX_SSE_REGS)
+					{
+						if (pParamTypeDescr->eTypeClass == typelib_TypeClass_FLOAT)
+						{
+                        	float tmp = (float) (*((double *)fpreg));
+                        	(*((float *) fpreg)) = tmp;
+						}
+						pCppArgs[nPos] = pUnoArgs[nPos] = fpreg++;
+						nf++;
+					}
+					else
+                    {
+						pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+                        bOverFlowUsed = true;
+                    }
+                    if (bOverFlowUsed) ovrflw++;
+					break;
+                case typelib_TypeClass_BYTE:
+                case typelib_TypeClass_BOOLEAN:
+                    if (ng < ppc64::MAX_GPR_REGS)
+					{
+                        pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-1));
+                        ng++;
+                        gpreg++;
+                    }
+                    else
+					{
+                        pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-1));
+                        bOverFlowUsed = true;
+                    }
+                    if (bOverFlowUsed) ovrflw++;
+                    break;
+                case typelib_TypeClass_CHAR:
+                case typelib_TypeClass_SHORT:
+                case typelib_TypeClass_UNSIGNED_SHORT:
+                    if (ng < ppc64::MAX_GPR_REGS)
+					{
+                        pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-2));
+                        ng++;
+                        gpreg++;
+                    }
+                    else
+					{
+                        pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-2));
+                        bOverFlowUsed = true;
+                    }
+                    if (bOverFlowUsed) ovrflw++;
+                    break;
+		case typelib_TypeClass_ENUM:
+                case typelib_TypeClass_LONG:
+                case typelib_TypeClass_UNSIGNED_LONG:
+                    if (ng < ppc64::MAX_GPR_REGS)
+					{
+                        pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-4));
+                        ng++;
+                        gpreg++;
+                    }
+                    else
+					{
+                        pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-4));
+                        bOverFlowUsed = true;
+                    }
+                    if (bOverFlowUsed) ovrflw++;
+                    break;
+				default:
+					if (ng < ppc64::MAX_GPR_REGS) 
+					{
+						pCppArgs[nPos] = pUnoArgs[nPos] = gpreg++;
+						ng++;
+					}
+					else
+                    {
+						pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+                        bOverFlowUsed = true;
+                    }
+                    if (bOverFlowUsed) ovrflw++;
+					break;
+		        }
+
+		        // no longer needed
+				TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		else // ptr to complex value | ref
+		{
+#ifdef CMC_DEBUG
+			fprintf(stderr, "complex, ng is %d\n", ng);
+#endif
+            void *pCppStack; //temporary stack pointer
+
+			if (ng < ppc64::MAX_GPR_REGS)
+			{ 
+		        pCppArgs[nPos] = pCppStack = *gpreg++;
+			    ng++;
+			}
+			else
+            {
+			    pCppArgs[nPos] = pCppStack = *ovrflw;
+                bOverFlowUsed = true;
+            }
+            if (bOverFlowUsed) ovrflw++;
+
+			if (! rParam.bIn) // is pure out
+			{
+				// uno out is unconstructed mem!
+				pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
+				pTempIndizes[nTempIndizes] = nPos;
+				// will be released at reconversion
+				ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+			}
+			// is in/inout
+			else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+			{
+				uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+										pCppStack, pParamTypeDescr,
+										pThis->getBridge()->getCpp2Uno() );
+				pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+				// will be released at reconversion
+				ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+			}
+			else // direct way
+			{
+				pUnoArgs[nPos] = pCppStack;
+				// no longer needed
+				TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+			}
+		}
+	}
+
+#ifdef CMC_DEBUG
+	fprintf(stderr, "end of params\n");
+#endif
+	
+	// ExceptionHolder
+	uno_Any aUnoExc; // Any will be constructed by callee
+	uno_Any * pUnoExc = &aUnoExc;
+
+	// invoke uno dispatch call
+	(*pThis->getUnoI()->pDispatcher)( pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+	
+	// in case an exception occurred...
+	if (pUnoExc)
+	{
+		// destruct temporary in/inout params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			
+			if (pParams[nIndex].bIn) // is in/inout => was constructed
+				uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 );
+			TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+		}
+		if (pReturnTypeDescr)
+			TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+		
+		CPPU_CURRENT_NAMESPACE::raiseException( &aUnoExc, pThis->getBridge()->getUno2Cpp() ); 
+                // has to destruct the any
+		// is here for dummy
+		return typelib_TypeClass_VOID;
+	}
+	else // else no exception occurred...
+	{
+		// temporary params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+			
+			if (pParams[nIndex].bOut) // inout/out
+			{
+				// convert and assign
+				uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+				uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr,
+										pThis->getBridge()->getUno2Cpp() );
+			}
+			// destroy temp uno param
+			uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
+			
+			TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		// return
+		if (pCppReturn) // has complex return
+		{
+			if (pUnoReturn != pCppReturn) // needs reconversion
+			{
+				uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr,
+										pThis->getBridge()->getUno2Cpp() );
+				// destroy temp uno return
+				uno_destructData( pUnoReturn, pReturnTypeDescr, 0 );
+			}
+			// complex return ptr is set to return reg
+			*(void **)pRegisterReturn = pCppReturn;
+		}
+		if (pReturnTypeDescr)
+		{
+			typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
+			TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+			return eRet;
+		}
+		else
+			return typelib_TypeClass_VOID;
+	}
+}
+
+
+//==================================================================================================
+static typelib_TypeClass cpp_mediate(
+	sal_uInt64 nOffsetAndIndex,
+        void ** gpreg, void ** fpreg, long sp,
+	sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+    OSL_ENSURE( sizeof(sal_Int64)==sizeof(void *), "### unexpected!" );
+
+    sal_Int32 nVtableOffset = (nOffsetAndIndex >> 32);
+    sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFFFFFF);
+
+    long sf = *(long*)sp;
+    void ** ovrflw = (void**)(sf + 112);
+	
+    // gpreg:  [ret *], this, [other gpr params]
+    // fpreg:  [fpr params]
+    // ovrflw: [gpr or fpr params (properly aligned)]
+
+    void * pThis;
+    if (nFunctionIndex & 0x80000000 )
+    {
+	nFunctionIndex &= 0x7fffffff;
+	pThis = gpreg[1];
+#ifdef CMC_DEBUG
+	fprintf(stderr, "pThis is gpreg[1]\n");
+#endif
+    }
+    else
+    {
+	pThis = gpreg[0];
+#ifdef CMC_DEBUG
+	fprintf(stderr, "pThis is gpreg[0]\n");
+#endif
+    }
+
+#ifdef CMC_DEBUG
+    fprintf(stderr, "pThis is %lx\n", pThis);
+#endif
+    
+    pThis = static_cast< char * >(pThis) - nVtableOffset;
+
+#ifdef CMC_DEBUG
+    fprintf(stderr, "pThis is now %lx\n", pThis);
+#endif
+
+    bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
+	    = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(
+			pThis);
+
+    typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
+
+#ifdef CMC_DEBUG
+    fprintf(stderr, "indexes are %d %d\n", nFunctionIndex, pTypeDescr->nMapFunctionIndexToMemberIndex);
+#endif
+	
+	OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" );
+	if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
+	{
+		throw RuntimeException(
+            rtl::OUString::createFromAscii("illegal vtable index!"),
+            (XInterface *)pThis );
+	}
+	
+	// determine called method
+	sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
+	OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
+
+#ifdef CMC_DEBUG
+	fprintf(stderr, "members are %d %d\n", nMemberPos, pTypeDescr->nAllMembers);
+#endif
+
+	TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
+    
+	typelib_TypeClass eRet;
+	switch (aMemberDescr.get()->eTypeClass)
+	{
+	case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+	{
+		if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex)
+		{
+			// is GET method
+			eRet = cpp2uno_call(
+				pCppI, aMemberDescr.get(),
+				((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef,
+				0, 0, // no params
+				gpreg, fpreg, ovrflw, pRegisterReturn );
+		}
+		else
+		{
+			// is SET method
+			typelib_MethodParameter aParam;
+			aParam.pTypeRef =
+				((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef;
+			aParam.bIn		= sal_True;
+			aParam.bOut		= sal_False;
+			
+			eRet = cpp2uno_call(
+				pCppI, aMemberDescr.get(),
+				0, // indicates void return
+				1, &aParam,
+				gpreg, fpreg, ovrflw, pRegisterReturn );
+		}
+		break;
+	}
+	case typelib_TypeClass_INTERFACE_METHOD:
+	{
+		// is METHOD
+		switch (nFunctionIndex)
+		{
+		case 1: // acquire()
+			pCppI->acquireProxy(); // non virtual call!
+			eRet = typelib_TypeClass_VOID;
+			break;
+		case 2: // release()
+			pCppI->releaseProxy(); // non virtual call!
+			eRet = typelib_TypeClass_VOID;
+			break;
+		case 0: // queryInterface() opt
+		{
+			typelib_TypeDescription * pTD = 0;
+			TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( gpreg[2] )->getTypeLibType() );
+			if (pTD)
+			{
+                XInterface * pInterface = 0;
+                (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
+                    pCppI->getBridge()->getCppEnv(),
+                    (void **)&pInterface, pCppI->getOid().pData, 
+                    (typelib_InterfaceTypeDescription *)pTD );
+			
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( gpreg[0] ),
+                        &pInterface, pTD, cpp_acquire );
+                    pInterface->release();
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *(void **)pRegisterReturn = gpreg[0];
+                    eRet = typelib_TypeClass_ANY;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+			}
+		} // else perform queryInterface()
+		default:
+			eRet = cpp2uno_call(
+				pCppI, aMemberDescr.get(),
+				((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef,
+				((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams,
+				((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams,
+				gpreg, fpreg, ovrflw, pRegisterReturn );
+		}
+		break;
+	}
+	default:
+	{
+#ifdef CMC_DEBUG
+	    fprintf(stderr, "screwed\n");
+#endif
+
+		throw RuntimeException(
+            rtl::OUString::createFromAscii("no member description found!"),
+            (XInterface *)pThis );
+		// is here for dummy
+		eRet = typelib_TypeClass_VOID;
+	}
+	}
+
+#ifdef CMC_DEBUG
+        fprintf(stderr, "end of cpp_mediate\n");
+#endif
+	return eRet;
+}
+
+extern "C" void privateSnippetExecutor( ... )
+{
+    volatile long nOffsetAndIndex;
+
+    //mr %r3, %r11            # move into arg1 the 64bit value passed from OOo
+    __asm__ __volatile__ (
+                "mr     %0,    11\n\t"
+                : "=r" (nOffsetAndIndex) : );
+
+    sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
+    double fpreg[ppc64::MAX_SSE_REGS];
+
+    __asm__ __volatile__ (
+        "std 3,   0(%0)\t\n"
+        "std 4,   8(%0)\t\n"
+        "std 5,  16(%0)\t\n"
+        "std 6,  24(%0)\t\n"
+        "std 7,  32(%0)\t\n"
+        "std 8,  40(%0)\t\n"
+        "std 9,  48(%0)\t\n"
+        "std 10, 56(%0)\t\n"
+        "stfd 1,   0(%1)\t\n"
+        "stfd 2,   8(%1)\t\n"
+        "stfd 3,  16(%1)\t\n"
+        "stfd 4,  24(%1)\t\n"
+        "stfd 5,  32(%1)\t\n"
+        "stfd 6,  40(%1)\t\n"
+        "stfd 7,  48(%1)\t\n"
+        "stfd 8,  56(%1)\t\n"
+        "stfd 9,  64(%1)\t\n"
+        "stfd 10, 72(%1)\t\n"
+        "stfd 11, 80(%1)\t\n"
+        "stfd 12, 88(%1)\t\n"
+        "stfd 13, 96(%1)\t\n"
+	: : "r" (gpreg), "r" (fpreg) 
+        : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
+          "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
+          "fr10", "fr11", "fr12", "fr13"
+    );
+
+    volatile long sp;
+
+    //stack pointer
+    __asm__ __volatile__ (
+                "mr     %0,    1\n\t"
+                : "=r" (sp) : );
+
+    volatile long nRegReturn[1];
+
+    typelib_TypeClass aType =
+        cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, (sal_Int64*)nRegReturn);
+
+    switch( aType )
+    {
+        case typelib_TypeClass_VOID:
+	    break;
+        case typelib_TypeClass_BOOLEAN:
+        case typelib_TypeClass_BYTE:
+            __asm__( "lbz 3,%0\n\t" 
+                : : "m" (nRegReturn[0]) );
+            break;
+        case typelib_TypeClass_CHAR:
+        case typelib_TypeClass_UNSIGNED_SHORT:
+            __asm__( "lhz 3,%0\n\t"
+                : : "m" (nRegReturn[0]) );
+            break;
+        case typelib_TypeClass_SHORT:
+            __asm__( "lha 3,%0\n\t"
+                : : "m" (nRegReturn[0]) );
+            break;
+        case typelib_TypeClass_ENUM:
+        case typelib_TypeClass_UNSIGNED_LONG:
+            __asm__( "lwz 3,%0\n\t"
+                : : "m"(nRegReturn[0]) );
+            break;
+        case typelib_TypeClass_LONG:
+            __asm__( "lwa 3,%0\n\t"
+                : : "m"(nRegReturn[0]) );
+            break;
+        case typelib_TypeClass_FLOAT:
+            __asm__( "lfs 1,%0\n\t" 
+                : : "m" (*((float*)nRegReturn)) );
+            break;
+        case typelib_TypeClass_DOUBLE:
+            __asm__( "lfd 1,%0\n\t" 
+                : : "m" (*((double*)nRegReturn)) );
+            break;
+        default:
+            __asm__( "ld 3,%0\n\t" 
+                : : "m" (nRegReturn[0]) );
+            break;
+    }
+}
+
+const int codeSnippetSize = 24;
+
+unsigned char *  codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, 
+                              bool simpleRetType)
+{
+#ifdef CMC_DEBUG
+    fprintf(stderr,"in codeSnippet functionIndex is %x\n", nFunctionIndex);
+    fprintf(stderr,"in codeSnippet vtableOffset is %x\n", nVtableOffset);
+#endif
+
+    sal_uInt64 nOffsetAndIndex = ( ( (sal_uInt64) nVtableOffset ) << 32 ) | ( (sal_uInt64) nFunctionIndex );
+
+    if ( !simpleRetType )
+        nOffsetAndIndex |= 0x80000000;
+
+    void ** raw = (void **)&code[0];
+    memcpy(raw, (char*) privateSnippetExecutor, 16);
+    raw[2] = (void*) nOffsetAndIndex;
+#ifdef CMC_DEBUG
+    fprintf(stderr, "in: offset/index is %x %x %d, %lx\n", 
+	nFunctionIndex, nVtableOffset, !simpleRetType, raw[2]);
+#endif
+    return (code + codeSnippetSize);
+}
+
+}
+
+void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const * bptr, unsigned char const * eptr)
+{
+    int const lineSize = 32;
+    for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+        __asm__ volatile ("dcbst 0, %0" : : "r"(p) : "memory");
+    }
+    __asm__ volatile ("sync" : : : "memory");
+    for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) {
+        __asm__ volatile ("icbi 0, %0" : : "r"(p) : "memory");
+    }
+    __asm__ volatile ("isync" : : : "memory");
+}
+
+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+{
+    return static_cast< Slot * >(block) + 2;
+}
+
+sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+    sal_Int32 slotCount)
+{
+    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+}
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::initializeBlock(
+    void * block, sal_Int32 slotCount)
+{
+    Slot * slots = mapBlockToVtable(block);
+    slots[-2].fn = 0;
+    slots[-1].fn = 0;
+    return slots + slotCount;
+}
+
+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+    Slot ** slots, unsigned char * code, sal_PtrDiff writetoexecdiff,
+    typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+    sal_Int32 functionCount, sal_Int32 vtableOffset)
+{
+     (*slots) -= functionCount;
+     Slot * s = *slots;
+#ifdef CMC_DEBUG
+    fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
+    fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
+#endif
+
+    for (sal_Int32 i = 0; i < type->nMembers; ++i) {
+        typelib_TypeDescription * member = 0;
+        TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+        OSL_ASSERT(member != 0);
+        switch (member->eTypeClass) {
+        case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+            // Getter:
+            (s++)->fn = code + writetoexecdiff;
+            code = codeSnippet(
+                code, functionOffset++, vtableOffset,
+                bridges::cpp_uno::shared::isSimpleType(
+                    reinterpret_cast<
+                    typelib_InterfaceAttributeTypeDescription * >(
+                        member)->pAttributeTypeRef));
+
+            // Setter:
+            if (!reinterpret_cast<
+                typelib_InterfaceAttributeTypeDescription * >(
+                    member)->bReadOnly)
+            {
+                (s++)->fn = code + writetoexecdiff;
+                code = codeSnippet(code, functionOffset++, vtableOffset, true);
+            }
+            break;
+
+        case typelib_TypeClass_INTERFACE_METHOD:
+            (s++)->fn = code + writetoexecdiff;
+            code = codeSnippet(
+                code, functionOffset++, vtableOffset,
+                bridges::cpp_uno::shared::isSimpleType(
+                    reinterpret_cast<
+                    typelib_InterfaceMethodTypeDescription * >(
+                        member)->pReturnTypeRef));
+            break;
+
+        default:
+            OSL_ASSERT(false);
+            break;
+        }
+        TYPELIB_DANGER_RELEASE(member);
+    }
+    return code;
+}
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/except.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/except.cxx
new file mode 100644
index 0000000..c0b6856
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/except.cxx
@@ -0,0 +1,283 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <stdio.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <cxxabi.h>
+#include <hash_map>
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <osl/diagnose.h>
+#include <osl/mutex.hxx>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <typelib/typedescription.hxx>
+#include <uno/any2.h>
+
+#include "share.hxx"
+
+
+using namespace ::std;
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+using namespace ::__cxxabiv1;
+
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+void dummy_can_throw_anything( char const * )
+{
+}
+
+//==================================================================================================
+static OUString toUNOname( char const * p ) SAL_THROW( () )
+{
+#if OSL_DEBUG_LEVEL > 1
+    char const * start = p;
+#endif
+
+    // example: N3com3sun4star4lang24IllegalArgumentExceptionE
+
+	OUStringBuffer buf( 64 );
+    OSL_ASSERT( 'N' == *p );
+    ++p; // skip N
+
+    while ('E' != *p)
+    {
+        // read chars count
+        long n = (*p++ - '0');
+        while ('0' <= *p && '9' >= *p)
+        {
+            n *= 10;
+            n += (*p++ - '0');
+        }
+        buf.appendAscii( p, n );
+        p += n;
+        if ('E' != *p)
+            buf.append( (sal_Unicode)'.' );
+    }
+
+#if OSL_DEBUG_LEVEL > 1
+    OUString ret( buf.makeStringAndClear() );
+    OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
+    fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
+    return ret;
+#else
+    return buf.makeStringAndClear();
+#endif
+}
+
+//==================================================================================================
+class RTTI
+{
+    typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map;
+
+    Mutex m_mutex;
+	t_rtti_map m_rttis;
+    t_rtti_map m_generatedRttis;
+
+    void * m_hApp;
+
+public:
+    RTTI() SAL_THROW( () );
+    ~RTTI() SAL_THROW( () );
+
+    type_info * getRTTI( typelib_CompoundTypeDescription * ) SAL_THROW( () );
+};
+//__________________________________________________________________________________________________
+RTTI::RTTI() SAL_THROW( () )
+    : m_hApp( dlopen( 0, RTLD_LAZY ) )
+{
+}
+//__________________________________________________________________________________________________
+RTTI::~RTTI() SAL_THROW( () )
+{
+    dlclose( m_hApp );
+}
+
+//__________________________________________________________________________________________________
+type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () )
+{
+    type_info * rtti;
+
+    OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName;
+
+    MutexGuard guard( m_mutex );
+    t_rtti_map::const_iterator iRttiFind( m_rttis.find( unoName ) );
+    if (iRttiFind == m_rttis.end())
+    {
+        // RTTI symbol
+        OStringBuffer buf( 64 );
+        buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") );
+        sal_Int32 index = 0;
+        do
+        {
+            OUString token( unoName.getToken( 0, '.', index ) );
+            buf.append( token.getLength() );
+            OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) );
+            buf.append( c_token );
+        }
+        while (index >= 0);
+        buf.append( 'E' );
+
+        OString symName( buf.makeStringAndClear() );
+        rtti = (type_info *)dlsym( m_hApp, symName.getStr() );
+
+        if (rtti)
+        {
+            pair< t_rtti_map::iterator, bool > insertion(
+                m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+            OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" );
+        }
+        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())
+            {
+                // we must generate it !
+                // symbol and rtti-name is nearly identical,
+                // the symbol is prefixed with _ZTI
+                char const * rttiName = symName.getStr() +4;
+#if OSL_DEBUG_LEVEL > 1
+                fprintf( stderr,"generated rtti for %s\n", rttiName );
+#endif
+                if (pTypeDescr->pBaseTypeDescription)
+                {
+                    // ensure availability of base
+                    type_info * base_rtti = getRTTI(
+                        (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription );
+                    rtti = new __si_class_type_info(
+                        strdup( rttiName ), (__class_type_info *)base_rtti );
+                }
+                else
+                {
+                    // this class has no base class
+                    rtti = new __class_type_info( strdup( rttiName ) );
+                }
+
+                pair< t_rtti_map::iterator, bool > insertion(
+                    m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+                OSL_ENSURE( insertion.second, "### inserting new generated rtti failed?!" );
+            }
+            else // taking already generated rtti
+            {
+                rtti = iFind->second;
+            }
+        }
+    }
+    else
+    {
+        rtti = iRttiFind->second;
+    }
+
+    return rtti;
+}
+
+//--------------------------------------------------------------------------------------------------
+static void deleteException( void * pExc )
+{
+    __cxa_exception const * header = ((__cxa_exception const *)pExc - 1);
+    typelib_TypeDescription * pTD = 0;
+    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    ::typelib_typedescription_getByName( &pTD, unoName.pData );
+    OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" );
+    if (pTD)
+    {
+		::uno_destructData( pExc, pTD, cpp_release );
+		::typelib_typedescription_release( pTD );
+	}
+}
+
+//==================================================================================================
+void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
+{
+    void * pCppExc;
+    type_info * rtti;
+
+    {
+    // construct cpp exception object
+	typelib_TypeDescription * pTypeDescr = 0;
+	TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
+    OSL_ASSERT( pTypeDescr );
+    if (! pTypeDescr)
+        terminate();
+
+	pCppExc = __cxa_allocate_exception( pTypeDescr->nSize );
+	::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
+
+	// destruct uno exception
+	::uno_any_destruct( pUnoExc, 0 );
+    // avoiding locked counts
+    static RTTI * s_rtti = 0;
+    if (! s_rtti)
+    {
+        MutexGuard guard( Mutex::getGlobalMutex() );
+        if (! s_rtti)
+        {
+#ifdef LEAK_STATIC_DATA
+            s_rtti = new RTTI();
+#else
+            static RTTI rtti_data;
+            s_rtti = &rtti_data;
+#endif
+        }
+    }
+	rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr );
+    TYPELIB_DANGER_RELEASE( pTypeDescr );
+    OSL_ENSURE( rtti, "### no rtti for throwing exception!" );
+    if (! rtti)
+        terminate();
+    }
+
+	__cxa_throw( pCppExc, rtti, deleteException );
+}
+
+//==================================================================================================
+void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+{
+    OSL_ENSURE( header, "### no exception header!!!" );
+    if (! header)
+        terminate();
+
+	typelib_TypeDescription * pExcTypeDescr = 0;
+    OUString unoName( toUNOname( header->exceptionType->name() ) );
+	::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
+    OSL_ENSURE( pExcTypeDescr, "### can not get type description for exception!!!" );
+    if (! pExcTypeDescr)
+        terminate();
+
+    // construct uno exception any
+    ::uno_any_constructAndConvert( pExc, header->adjustedPtr, pExcTypeDescr, pCpp2Uno );
+    ::typelib_typedescription_release( pExcTypeDescr );
+}
+
+}
+
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
new file mode 100644
index 0000000..9093919
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
@@ -0,0 +1,75 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+PRJ=..$/..$/..
+
+PRJNAME=bridges
+TARGET=gcc3_uno
+LIBTARGET=no
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE :  settings.mk
+
+# --- Files --------------------------------------------------------
+
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "GCCLINUXPgcc3POWERPC64"
+
+.IF "$(cppu_no_leak)" == ""
+CFLAGS += -DLEAK_STATIC_DATA
+.ENDIF
+
+# In case someone enabled the non-standard -fomit-frame-pointer which does not
+# work with the .cxx sources in this directory:
+CFLAGSCXX += -fno-omit-frame-pointer
+
+NOOPTFILES= \
+	$(SLO)$/uno2cpp.obj \
+	$(SLO)$/cpp2uno.obj
+
+CFLAGSNOOPT=-O0
+
+SLOFILES= \
+	$(SLO)$/except.obj		\
+	$(SLO)$/cpp2uno.obj		\
+	$(SLO)$/uno2cpp.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1IMPLIB=i$(TARGET)
+SHL1VERSIONMAP=..$/..$/bridge_exports.map
+
+SHL1OBJS= $(SLOFILES)
+SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
+
+SHL1STDLIBS= \
+	$(CPPULIB)			\
+	$(SALLIB)
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :  target.mk
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx
new file mode 100644
index 0000000..649be7d
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/share.hxx
@@ -0,0 +1,92 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+#include "uno/mapping.h"
+
+#include <typeinfo>
+#include <exception>
+#include <cstddef>
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+  void dummy_can_throw_anything( char const * );
+
+
+// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
+
+struct _Unwind_Exception
+{
+    unsigned exception_class __attribute__((__mode__(__DI__)));
+    void * exception_cleanup;
+    unsigned private_1 __attribute__((__mode__(__word__)));
+    unsigned private_2 __attribute__((__mode__(__word__)));
+} __attribute__((__aligned__));
+
+struct __cxa_exception
+{ 
+    ::std::type_info *exceptionType;
+    void (*exceptionDestructor)(void *); 
+    
+    ::std::unexpected_handler unexpectedHandler;
+    ::std::terminate_handler terminateHandler;
+    
+    __cxa_exception *nextException;
+    
+    int handlerCount;
+    
+    int handlerSwitchValue;
+    const unsigned char *actionRecord;
+    const unsigned char *languageSpecificData;
+    void *catchTemp;
+    void *adjustedPtr;
+    
+    _Unwind_Exception unwindHeader;
+};    
+
+extern "C" void *__cxa_allocate_exception(
+    std::size_t thrown_size ) throw();
+extern "C" void __cxa_throw (
+    void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn));
+
+struct __cxa_eh_globals
+{
+    __cxa_exception *caughtExceptions;
+    unsigned int uncaughtExceptions;
+};
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+
+// -----
+
+//==================================================================================================
+void raiseException(
+    uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
+//==================================================================================================
+void fillUnoException(
+    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+}
+
+namespace ppc64
+{
+	enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+}
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
new file mode 100644
index 0000000..5002cf9
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
@@ -0,0 +1,596 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <malloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/vtables.hxx"
+
+#include "share.hxx"
+
+#include <stdio.h>
+#include <string.h>
+
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn)
+{
+    switch (eTypeClass)
+    {
+    case typelib_TypeClass_HYPER:
+    case typelib_TypeClass_UNSIGNED_HYPER:
+            *reinterpret_cast<sal_uInt64 *>( pRegisterReturn ) = r3;
+            break;
+    case typelib_TypeClass_LONG:
+    case typelib_TypeClass_UNSIGNED_LONG:
+    case typelib_TypeClass_ENUM:
+            *reinterpret_cast<sal_uInt32 *>( pRegisterReturn ) = r3;
+            break;
+    case typelib_TypeClass_CHAR:
+    case typelib_TypeClass_SHORT:
+    case typelib_TypeClass_UNSIGNED_SHORT:
+            *reinterpret_cast<sal_uInt16 *>( pRegisterReturn ) = (unsigned short)r3;
+            break;
+    case typelib_TypeClass_BOOLEAN:
+    case typelib_TypeClass_BYTE:
+            *reinterpret_cast<sal_uInt8 *>( pRegisterReturn ) = (unsigned char)r3;
+            break;
+    case typelib_TypeClass_FLOAT:
+            *reinterpret_cast<float *>( pRegisterReturn ) = dret;
+	    break;
+    case typelib_TypeClass_DOUBLE:
+            *reinterpret_cast<double *>( pRegisterReturn ) = dret;
+            break;
+    default:
+            break;
+    }
+}
+
+namespace
+{
+//==================================================================================================
+static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex, 
+	void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, 
+        sal_uInt64 *pStack, sal_uInt32 nStack,
+        sal_uInt64 *pGPR, sal_uInt32 nGPR,
+        double *pFPR, sal_uInt32 nFPR)
+{
+    // Stack, if used, must be 16-bytes aligned
+    if ( nStack )
+        nStack = ( nStack + 1 ) & ~1;
+
+    // Should not happen, but...
+    if ( nFPR > ppc64::MAX_SSE_REGS )
+        nFPR = ppc64::MAX_SSE_REGS;
+    if ( nGPR > ppc64::MAX_GPR_REGS )
+        nGPR = ppc64::MAX_GPR_REGS;
+
+#ifdef CMC_DEBUG
+        // 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, "0x%lx (%f), ", pFPR[i], pFPR[i] );
+                fprintf( stderr, "\nStack (%d): ", nStack );
+                for ( int i = 0; i < nStack; ++i )
+                        fprintf( stderr, "0x%lx, ", pStack[i] );
+                fprintf( stderr, "\n" );
+        }
+#endif
+
+    // Load parameters to stack, if necessary
+    sal_uInt64 *stack = (sal_uInt64 *) __builtin_alloca( nStack * 8 );
+    memcpy( stack, pStack, nStack * 8 );
+
+    // Get pointer to method
+    sal_uInt64 pMethod = *((sal_uInt64 *)pThis);
+    pMethod += 8 * nVtableIndex;
+    pMethod = *((sal_uInt64 *)pMethod);
+
+    typedef void (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 );
+    FunctionCall pFunc = (FunctionCall)pMethod;
+
+    volatile double dret;
+
+    //  fill registers
+    __asm__ __volatile__ (
+                "ld   3,  0(%0)\n\t"
+                "ld   4,  8(%0)\n\t"
+                "ld   5, 16(%0)\n\t"
+                "ld   6, 24(%0)\n\t"
+                "ld   7, 32(%0)\n\t"
+                "ld   8, 40(%0)\n\t"
+                "ld   9, 48(%0)\n\t"
+                "ld  10, 56(%0)\n\t"
+                "lfd  1,  0(%1)\n\t"
+                "lfd  2,  8(%1)\n\t"
+                "lfd  3, 16(%1)\n\t"
+                "lfd  4, 24(%1)\n\t"
+                "lfd  5, 32(%1)\n\t"
+                "lfd  6, 40(%1)\n\t"
+                "lfd  7, 48(%1)\n\t"
+                "lfd  8, 56(%1)\n\t"
+                "lfd  9, 64(%1)\n\t"
+                "lfd 10, 72(%1)\n\t"
+                "lfd 11, 80(%1)\n\t"
+                "lfd 12, 88(%1)\n\t"
+                "lfd 13, 96(%1)\n\t"
+                : : "r" (pGPR), "r" (pFPR)
+          	: "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
+                  "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
+                  "fr10", "fr11", "fr12", "fr13"
+    );
+
+    // tell gcc that r3 to r11 are not available to it for doing the TOC and exception munge on the func call
+    register sal_uInt64 r3 asm("r3");
+    register sal_uInt64 r4 asm("r4");
+    register sal_uInt64 r5 asm("r5");
+    register sal_uInt64 r6 asm("r6");
+    register sal_uInt64 r7 asm("r7");
+    register sal_uInt64 r8 asm("r8");
+    register sal_uInt64 r9 asm("r9");
+    register sal_uInt64 r10 asm("r10");
+    register sal_uInt64 r11 asm("r11");
+
+    (*pFunc)(r3, r4, r5, r6, r7, r8, r9, r10);
+
+    // get return value
+    __asm__ __volatile__ (
+                "mr     %1,     3\n\t"
+                "mr     %2,     4\n\t"
+                "fmr    %0,     1\n\t"
+                : "=f" (dret), "=r" (r3), "=r" (r4) : );
+
+    MapReturn(r3, dret, pReturnTypeDescr->eTypeClass, pRegisterReturn);
+}
+
+// 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( pSV, nr, pFPR, pDS, bOverflow ) \
+        if ( nr < ppc64::MAX_SSE_REGS ) \
+                pFPR[nr++] = *reinterpret_cast<float *>( pSV ); \
+        else \
+        	bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
+
+#define INSERT_DOUBLE( pSV, nr, pFPR, pDS, bOverflow ) \
+        if ( nr < ppc64::MAX_SSE_REGS ) \
+                pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
+        else \
+        	bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
+
+#define INSERT_INT64( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < ppc64::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
+        else \
+		bOverFlow = true; \
+	if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV );
+
+#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < ppc64::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
+
+#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < ppc64::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
+
+#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < ppc64::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt8 *>( pSV );
+
+//================================================================================================== 
+static void cpp_call(
+	bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+	bridges::cpp_uno::shared::VtableSlot  aVtableSlot,
+	typelib_TypeDescriptionReference * pReturnTypeRef,
+	sal_Int32 nParams, typelib_MethodParameter * pParams,
+	void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
+{
+  	// max space for: [complex ret ptr], values|ptr ...
+  	sal_uInt64 * pStack = (sal_uInt64 *)alloca( (nParams+3) * sizeof(sal_Int64) );
+  	sal_uInt64 * pStackStart = pStack;
+
+	sal_uInt64 pGPR[ppc64::MAX_GPR_REGS];
+	sal_uInt32 nGPR = 0;
+
+	double pFPR[ppc64::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
+
+        bool bOverFlow = false;
+
+	if (pReturnTypeDescr)
+	{
+#ifdef CMC_DEBUG
+		fprintf(stderr, "return type is %d\n", pReturnTypeDescr->eTypeClass);
+#endif
+		if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+		{
+			pCppReturn = pUnoReturn; // direct way for simple types
+#ifdef CMC_DEBUG
+			fprintf(stderr, "simple return\n");
+#endif
+		}
+		else
+		{
+			// complex return via ptr
+			pCppReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+			       ? alloca( pReturnTypeDescr->nSize ) : pUnoReturn);
+#ifdef CMC_DEBUG
+			fprintf(stderr, "pCppReturn/pUnoReturn is %lx/%lx", pCppReturn, pUnoReturn);
+#endif
+			INSERT_INT64( &pCppReturn, nGPR, pGPR, pStack, bOverFlow );
+		}
+	}
+	// push "this" pointer
+        void * pAdjustedThisPtr = reinterpret_cast< void ** >( pThis->getCppI() ) + aVtableSlot.offset;
+#ifdef CMC_DEBUG
+	fprintf(stderr, "this pointer is %p\n", pAdjustedThisPtr);
+#endif
+	INSERT_INT64( &pAdjustedThisPtr, nGPR, pGPR, pStack, bOverFlow );
+
+        // Args 
+        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;
+
+#ifdef CMC_DEBUG
+	fprintf(stderr, "n params is %d\n", nParams);
+#endif
+	
+	for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+	{
+		const typelib_MethodParameter & rParam = pParams[nPos];
+		typelib_TypeDescription * pParamTypeDescr = 0;
+		TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+#ifdef CMC_DEBUG
+		fprintf(stderr, "param %d is %d %d %d\n", nPos, rParam.bOut, bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ),
+			pParamTypeDescr->eTypeClass);
+#endif
+		
+		if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+		{
+//			uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), pUnoArgs[nPos], pParamTypeDescr,
+			uno_copyAndConvertData( pCppArgs[nPos] = pStack, pUnoArgs[nPos], pParamTypeDescr,
+									pThis->getBridge()->getUno2Cpp() );
+		        switch (pParamTypeDescr->eTypeClass)
+                        {
+                        case typelib_TypeClass_HYPER:
+                        case typelib_TypeClass_UNSIGNED_HYPER:
+#ifdef CMC_DEBUG
+				fprintf(stderr, "hyper is %lx\n", pCppArgs[nPos]);
+#endif
+                                INSERT_INT64( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                                break;
+                        case typelib_TypeClass_LONG:
+                        case typelib_TypeClass_UNSIGNED_LONG:
+                        case typelib_TypeClass_ENUM:
+#ifdef CMC_DEBUG
+				fprintf(stderr, "long is %x\n", pCppArgs[nPos]);
+#endif
+                                INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                                break;
+                        case typelib_TypeClass_SHORT:
+                        case typelib_TypeClass_CHAR:
+                        case typelib_TypeClass_UNSIGNED_SHORT:
+                                INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                                break;
+                        case typelib_TypeClass_BOOLEAN:
+                        case typelib_TypeClass_BYTE:
+                                INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                                break;
+                        case typelib_TypeClass_FLOAT:
+                                INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, pStack, bOverFlow );
+				break;
+                        case typelib_TypeClass_DOUBLE:
+                                INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack, bOverFlow );
+                                break;
+                        }
+
+                        // no longer needed
+                        TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+	
+		}
+		else // ptr to complex value | ref
+		{
+#ifdef CMC_DEBUG
+			fprintf(stderr, "complex type again %d\n", rParam.bIn);
+#endif
+                        if (! rParam.bIn) // is pure out
+                        {
+#ifdef CMC_DEBUG
+				fprintf(stderr, "complex size is %d\n", pParamTypeDescr->nSize );
+#endif
+                                // cpp out is constructed mem, uno out is not!
+                                uno_constructData(
+                                        pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                                        pParamTypeDescr ); 
+                                pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+                                // will be released at reconversion
+                                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+                        }
+                        // is in/inout
+                        else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+                        {
+#ifdef CMC_DEBUG
+				fprintf(stderr, "this one\n");
+#endif
+                                uno_copyAndConvertData(
+                                        pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                                        pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
+
+                                pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+                                // will be released at reconversion
+                                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+                        }
+                        else // direct way
+                        {
+#ifdef CMC_DEBUG
+				fprintf(stderr, "that one, passing %lx through\n", pUnoArgs[nPos]);
+#endif
+                                pCppArgs[nPos] = pUnoArgs[nPos];
+                                // no longer needed
+                                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+                        }
+                        INSERT_INT64( &(pCppArgs[nPos]), nGPR, pGPR, pStack, bOverFlow );
+		}
+	}
+  
+	try
+	{
+               callVirtualMethod(
+                        pAdjustedThisPtr, aVtableSlot.index,
+                        pCppReturn, pReturnTypeDescr, 
+                        pStackStart, ( pStack - pStackStart ),
+                        pGPR, nGPR,
+                        pFPR, nFPR );
+		// NO exception occurred...
+		*ppUnoExc = 0;
+		
+		// reconvert temporary params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+			
+			if (pParams[nIndex].bIn)
+			{
+				if (pParams[nIndex].bOut) // inout
+				{
+					uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value
+					uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+											pThis->getBridge()->getCpp2Uno() );
+				}
+			}
+			else // pure out
+			{
+				uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+										pThis->getBridge()->getCpp2Uno() );
+			}
+			// destroy temp cpp param => cpp: every param was constructed
+			uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+			
+			TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+		}
+		// return value
+		if (pCppReturn && pUnoReturn != pCppReturn)
+		{
+			uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr,
+									pThis->getBridge()->getCpp2Uno() );
+			uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
+		}
+	}
+ 	catch (...)
+ 	{
+  		// fill uno exception
+		fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, 
+                                  *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        
+		// temporary params
+		for ( ; nTempIndizes--; )
+		{
+			sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+			// destroy temp cpp param => cpp: every param was constructed
+			uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release );
+			TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+		}
+		// return type
+		if (pReturnTypeDescr)
+			TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+	}
+}
+
+}
+
+namespace bridges { namespace cpp_uno { namespace shared {
+
+void unoInterfaceProxyDispatch(
+	uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
+	void * pReturn, void * pArgs[], uno_Any ** ppException )
+{
+	// is my surrogate
+        bridges::cpp_uno::shared::UnoInterfaceProxy * pThis 
+            = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI);
+	typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
+	
+	switch (pMemberDescr->eTypeClass)
+	{
+	case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+	{
+
+        VtableSlot aVtableSlot(
+            getVtableSlot(
+                reinterpret_cast<
+                    typelib_InterfaceAttributeTypeDescription const * >(
+                        pMemberDescr)));
+
+		if (pReturn)
+		{
+			// dependent dispatch
+			cpp_call(
+				pThis, aVtableSlot,
+				((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef,
+				0, 0, // no params
+				pReturn, pArgs, ppException );
+		}
+		else
+		{
+			// is SET
+			typelib_MethodParameter aParam;
+			aParam.pTypeRef =
+				((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef;
+			aParam.bIn		= sal_True;
+			aParam.bOut		= sal_False;
+
+			typelib_TypeDescriptionReference * pReturnTypeRef = 0;
+			OUString aVoidName( RTL_CONSTASCII_USTRINGPARAM("void") );
+			typelib_typedescriptionreference_new(
+				&pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
+			
+			// dependent dispatch
+                        aVtableSlot.index += 1; //get then set method
+			cpp_call(
+				pThis, aVtableSlot,
+				pReturnTypeRef,
+				1, &aParam,
+				pReturn, pArgs, ppException );
+			
+			typelib_typedescriptionreference_release( pReturnTypeRef );
+		}
+		
+		break;
+	}
+	case typelib_TypeClass_INTERFACE_METHOD:
+	{
+
+        VtableSlot aVtableSlot(
+            getVtableSlot(
+                reinterpret_cast<
+                    typelib_InterfaceMethodTypeDescription const * >(
+                        pMemberDescr)));
+		switch (aVtableSlot.index)
+		{
+			// standard calls
+		case 1: // acquire uno interface
+			(*pUnoI->acquire)( pUnoI );
+			*ppException = 0;
+			break;
+		case 2: // release uno interface
+			(*pUnoI->release)( pUnoI );
+			*ppException = 0;
+			break;
+		case 0: // queryInterface() opt
+		{
+			typelib_TypeDescription * pTD = 0;
+			TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() );
+			if (pTD)
+			{
+                uno_Interface * pInterface = 0;
+                (*pThis->pBridge->getUnoEnv()->getRegisteredInterface)(
+                    pThis->pBridge->getUnoEnv(),
+                    (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD );
+			
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( pReturn ),
+                        &pInterface, pTD, 0 );
+                    (*pInterface->release)( pInterface );
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *ppException = 0;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+            }
+		} // else perform queryInterface()
+		default:
+			// dependent dispatch
+			cpp_call(
+				pThis, aVtableSlot,
+				((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef,
+				((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams,
+				((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams,
+				pReturn, pArgs, ppException );
+		}
+		break;
+	}
+	default:
+	{
+		::com::sun::star::uno::RuntimeException aExc(
+			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal member type description!") ),
+			::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() );
+		
+		Type const & rExcType = ::getCppuType( &aExc );
+		// binary identical null reference
+		::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 );
+	}
+	}
+}
+
+} } }
diff --git a/main/set_soenv.in b/main/set_soenv.in
index 643f259..0b19acb 100644
--- a/main/set_soenv.in
+++ b/main/set_soenv.in
@@ -397,6 +397,46 @@ elsif ( $platform =~ m/freebsd/ )
       $JRETOOLKITDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."i386".$ds."client";
       $JRETHREADDIR   = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."i386".$ds."native_threads";
    }
+   elsif ($platform =~ m/^powerpc/)
+   {
+      if (($platform =~ m/^powerpc64/) && ('@SIZEOF_LONG@' eq '8')) {
+         print "Setting FreeBSD PPC64 specific values... ";
+         $outfile = "FreeBSDPPC64Env.Set"; 
+         $OUTPATH = "unxfbsdppc64";
+         $CPUNAME = "POWERPC64";
+
+         if ( $JDK eq "gcj" ) {
+            $JRELIBDIR      = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64";
+            $JRETOOLKITDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64".$ds."client";
+            $JRETHREADDIR   = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc64".$ds."native_threads";
+         }
+      }
+      else {
+         print "Setting FreeBSD PPC specific values... ";
+         $outfile = "FreeBSDPPCEnv.Set"; 
+         $OUTPATH = "unxlngppc";
+         $CPUNAME = "POWERPC";
+
+         if ( $JDK eq "gcj" ) {
+            $JRELIBDIR      = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
+            $JRETOOLKITDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."client";
+            $JRETHREADDIR   = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."native_threads"; }
+         elsif ($JDK =~ m/^[Ii][Bb][Mm]/)
+         {  $JRELIBDIR     = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
+            $JRETOOLKITDIR = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."classic";
+            $JRETHREADDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
+         }
+	 # OpenJDK
+	 elsif ($JDK =~ m/sun/) {
+	    $JRELIBDIR      = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc";
+	    $JRETOOLKITDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."server";
+	    $JRETHREADDIR   = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."ppc".$ds."native_threads";
+	 }
+      }
+
+      $CPU            = "P";
+
+   }
    else
    {  print "Unsupported FreeBSD architecture: $platform \n";
          exit 1;
diff --git a/main/solenv/inc/unxfbsd.mk b/main/solenv/inc/unxfbsd.mk
index 39103ee..816f090 100644
--- a/main/solenv/inc/unxfbsd.mk
+++ b/main/solenv/inc/unxfbsd.mk
@@ -37,6 +37,12 @@ JAVAFLAGSDEBUG=-g
 .IF "$(CPUNAME)" == "X86_64"
 .INCLUDE : unxfbsdx.mk
 .ENDIF
+.IF "$(CPUNAME)" == "POWERPC"
+.INCLUDE : unxfbsdppc.mk
+.ENDIF
+.IF "$(CPUNAME)" == "POWERPC64"
+.INCLUDE : unxfbsdppc64.mk
+.ENDIF
 
 # filter for supressing verbose messages from linker
 #not needed at the moment
diff --git a/main/solenv/inc/unxfbsdppc.mk b/main/solenv/inc/unxfbsdppc.mk
new file mode 100644
index 0000000..7f48122
--- /dev/null
+++ b/main/solenv/inc/unxfbsdppc.mk
@@ -0,0 +1,30 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+# mk file for Unix FreeBSD PowerPC using GCC, please make generic
+# modifications to unxfbsd.mk
+
+DEFAULTOPT=-Os
+PICSWITCH:=-fPIC
+CDEFS+=-DPOWERPC -DPPC
+DLLPOSTFIX=
diff --git a/main/solenv/inc/unxfbsdppc64.mk b/main/solenv/inc/unxfbsdppc64.mk
new file mode 100644
index 0000000..76e89c9
--- /dev/null
+++ b/main/solenv/inc/unxfbsdppc64.mk
@@ -0,0 +1,31 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+# mk file for Unix FreeBSD 64Bit PowerPC using GCC, inherit from
+# ppc and add some flags
+
+.INCLUDE : unxfbsdppc.mk
+
+CDEFS+=-DPOWERPC64
+CFLAGSCXX+=-mminimal-toc
+BUILD64=1


[openoffice] 02/07: Update endianness detection on FreeBSD.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit 941ddfd73d646765e35cc2fe66faf001ddda895c
Author: pfg <pf...@13f79535-47bb-0310-9956-ffa450edef68>
AuthorDate: Thu Dec 8 01:56:31 2016 +0000

    Update endianness detection on FreeBSD.
    
    This produces a working AOO on FreeBSD PowerPC64!
    
    This is related to i126615 which was also fixed by Curtis a while ago.
    Kudos for both contributions, makes me want to get a PowerPC to run
    FreeBSD + AOO on it!
    
    Author:	Curtis Hamilton -- cmhamilto at gmail
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1773166 13f79535-47bb-0310-9956-ffa450edef68
---
 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk |  2 +-
 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx |  2 +-
 main/desktop/source/deployment/misc/dp_platform.cxx            |  6 ++++++
 main/odk/settings/platform.mk                                  |  3 +++
 main/odk/settings/settings.mk                                  |  7 +++++++
 main/sal/inc/osl/endian.h                                      |  6 ++----
 main/sal/osl/unx/system.h                                      |  8 ++++----
 main/solenv/gbuild/platform/freebsd.mk                         | 10 ++++++++++
 main/solenv/inc/libs.mk                                        |  3 +++
 main/solenv/inc/unx.mk                                         |  4 ++++
 main/solenv/inc/unxfbsd.mk                                     |  3 +++
 main/testtools/source/bridgetest/makefile.mk                   |  2 +-
 12 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
index 9093919..0676b13 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
@@ -34,7 +34,7 @@ ENABLE_EXCEPTIONS=TRUE
 
 # --- Files --------------------------------------------------------
 
-.IF "$(COM)$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "GCCLINUXPgcc3POWERPC64"
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "GCCFREEBSDPgcc3POWERPC64"
 
 .IF "$(cppu_no_leak)" == ""
 CFLAGS += -DLEAK_STATIC_DATA
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
index 5002cf9..59f9e3a 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/uno2cpp.cxx
@@ -24,7 +24,7 @@
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_bridges.hxx"
 
-#include <malloc.h>
+#include <stdlib.h>
 
 #include <com/sun/star/uno/genfunc.hxx>
 #include <uno/data.h>
diff --git a/main/desktop/source/deployment/misc/dp_platform.cxx b/main/desktop/source/deployment/misc/dp_platform.cxx
index f78aea9..5fee74d 100644
--- a/main/desktop/source/deployment/misc/dp_platform.cxx
+++ b/main/desktop/source/deployment/misc/dp_platform.cxx
@@ -56,6 +56,8 @@
 #define PLATFORM_SOLARIS_SPARC      "solaris_sparc"
 #define PLATFORM_SOLARIS_SPARC64    "solaris_sparc64"
 #define PLATFORM_SOLARIS_X86        "solaris_x86"
+#define PLATFORM_FREEBSD_POWERPC    "freebsd_powerpc"
+#define PLATFORM_FREEBSD_POWERPC64  "freebsd_powerpc64"
 #define PLATFORM_FREEBSD_X86        "freebsd_x86"
 #define PLATFORM_FREEBSD_X86_64     "freebsd_x86_64"
 #define PLATFORM_MACOSX_X86         "macosx_x86"
@@ -134,6 +136,10 @@ namespace
             ret = checkOSandCPU(OUSTR("kFreeBSD"), OUSTR("X86_64"));  
         else if (token.equals(OUSTR(PLATFORM_LINUX_SPARC)))
             ret = checkOSandCPU(OUSTR("Linux"), OUSTR("SPARC"));  
+        else if (token.equals(OUSTR(PLATFORM_FREEBSD_POWERPC)))
+            ret = checkOSandCPU(OUSTR("FreeBSD"), OUSTR("PowerPC"));  
+        else if (token.equals(OUSTR(PLATFORM_FREEBSD_POWERPC64)))
+            ret = checkOSandCPU(OUSTR("FreeBSD"), OUSTR("PowerPC64"));  
         else if (token.equals(OUSTR(PLATFORM_LINUX_POWERPC)))
             ret = checkOSandCPU(OUSTR("Linux"), OUSTR("PowerPC"));  
         else if (token.equals(OUSTR(PLATFORM_LINUX_POWERPC64)))
diff --git a/main/odk/settings/platform.mk b/main/odk/settings/platform.mk
index 30800be..de79b52 100644
--- a/main/odk/settings/platform.mk
+++ b/main/odk/settings/platform.mk
@@ -34,6 +34,9 @@ else
 	ifeq "$(UNOPKG_PLATFORM)" "Linux_PowerPC"
 		EXTENSION_PLATFORM=linux_powerpc
 	else
+	ifeq "$(UNOPKG_PLATFORM)" "FreeBSD_PowerPC64"
+		EXTENSION_PLATFORM=freebsd_powerpc64
+	else
 	ifeq "$(UNOPKG_PLATFORM)" "Linux_x86"
 		EXTENSION_PLATFORM=linux_x86
 	else
diff --git a/main/odk/settings/settings.mk b/main/odk/settings/settings.mk
index b4bb4f5..93b1163 100644
--- a/main/odk/settings/settings.mk
+++ b/main/odk/settings/settings.mk
@@ -507,6 +507,9 @@ UNOPKG_PLATFORM=FreeBSD_x86_64
 else
 UNOPKG_PLATFORM=FreeBSD_x86
 endif
+ifeq "$(PROCTYPE)" "powerpc"
+UNOPKG_PLATFORM=FreeBSD_ppc
+endif
 endif
 
 ifeq "$(PROCTYPE)" "x86_64"
@@ -515,6 +518,10 @@ else
 JAVA_PROC_TYPE=i386
 endif
 
+ifeq "$(PROCTYPE)" "powerpc64"
+JAVA_PROC_TYPE=ppc64
+endif
+
 ifeq (kfreebsd,$(findstring kfreebsd,$(PLATFORM)))
 OS=LINUX
 else
diff --git a/main/sal/inc/osl/endian.h b/main/sal/inc/osl/endian.h
index 33c3bb3..b6de92b 100644
--- a/main/sal/inc/osl/endian.h
+++ b/main/sal/inc/osl/endian.h
@@ -73,16 +73,14 @@ extern "C" {
 #ifdef FREEBSD
 #   include <sys/param.h>
 #   include <machine/endian.h>
-#if __FreeBSD_version < 500000
 #   if BYTE_ORDER == LITTLE_ENDIAN
-#   	define _LITTLE_ENDIAN
+#   	undef _BIG_ENDIAN
 #   elif BYTE_ORDER == BIG_ENDIAN
-#   	define _BIG_ENDIAN
+#   	undef _LITTLE_ENDIAN
 #   elif BYTE_ORDER == PDP_ENDIAN
 #   	define _PDP_ENDIAN
 #   endif
 #endif
-#endif
 
 #ifdef SCO
 #   include <sys/types.h>
diff --git a/main/sal/osl/unx/system.h b/main/sal/osl/unx/system.h
index 8f2f327..1672d13 100644
--- a/main/sal/osl/unx/system.h
+++ b/main/sal/osl/unx/system.h
@@ -126,6 +126,8 @@
 
 #endif
 
+#include <osl/endian.h>
+
 #ifdef NETBSD
 #	define  ETIME ETIMEDOUT
 #	define _POSIX_THREAD_SYSCALL_SOFT 1
@@ -176,15 +178,13 @@
 #   include <netinet/tcp.h>
 #	define 	IORESOURCE_TRANSFER_BSD 
 #   include <machine/endian.h>
-#if __FreeBSD_version < 500000
 #   if BYTE_ORDER == LITTLE_ENDIAN
-#   	define _LITTLE_ENDIAN
+#   	undef _BIG_ENDIAN
 #   elif BYTE_ORDER == BIG_ENDIAN
-#   	define _BIG_ENDIAN
+#   	undef _LITTLE_ENDIAN
 #   elif BYTE_ORDER == PDP_ENDIAN
 #   	define _PDP_ENDIAN
 #   endif
-#endif
 #	define  NO_PTHREAD_RTL
 #endif
 
diff --git a/main/solenv/gbuild/platform/freebsd.mk b/main/solenv/gbuild/platform/freebsd.mk
index 5095e60..cddce7b 100644
--- a/main/solenv/gbuild/platform/freebsd.mk
+++ b/main/solenv/gbuild/platform/freebsd.mk
@@ -36,6 +36,10 @@ ifeq ($(CPU),X)
 CPUNAME := X86_64
 endif
 
+ifeq ($(CPU),P)
+CPUNAME := POWERPC64
+endif
+
 # use CC/CXX if they are nondefaults
 ifneq ($(origin CC),default)
 gb_CC := $(CC)
@@ -68,6 +72,12 @@ else
 gb_CPUDEFS := -DX86
 endif
 
+ifeq ($(CPUNAME),POWERPC64)
+gb_CPUDEFS := -D$(CPUNAME)
+else
+gb_CPUDEFS := -DPOWERPC64
+endif
+
 gb_CFLAGS := \
 	-Wall \
 	-Wendif-labels \
diff --git a/main/solenv/inc/libs.mk b/main/solenv/inc/libs.mk
index e1dc43b..d9f72cf 100644
--- a/main/solenv/inc/libs.mk
+++ b/main/solenv/inc/libs.mk
@@ -238,6 +238,9 @@ NEON3RDLIB=$(SOLARLIBDIR)/libneon.dylib
 .ELSE
 NEON3RDLIB=-lneon
 .ENDIF
+.IF "$(OS)" == "FREEBSD" && "$(CPUNAME)" == "POWERPC64"
+JPEG3RDLIB=/usr/local/lib/libjpeg.so
+.ENDIF
 CURLLIB=-lcurl
 SFX2LIB=-lsfx$(DLLPOSTFIX)
 SFXLIB=-lsfx$(DLLPOSTFIX)
diff --git a/main/solenv/inc/unx.mk b/main/solenv/inc/unx.mk
index 57a47f4..1f4383b 100644
--- a/main/solenv/inc/unx.mk
+++ b/main/solenv/inc/unx.mk
@@ -95,6 +95,10 @@
 .INCLUDE : unxlngppc64.mk
 .ENDIF
 
+.IF "$(COM)$(OS)$(CPU)$(CPUNAME)" == "GCCFREEBSDPPOWERPC64"
+.INCLUDE : unxfbsdp.mk
+.ENDIF
+
 .IF "$(COM)$(OS)$(CPU)$(CPUNAME)" == "GCCLINUX3S390"
 .INCLUDE : unxlngs390.mk
 .ENDIF
diff --git a/main/solenv/inc/unxfbsd.mk b/main/solenv/inc/unxfbsd.mk
index 816f090..1955f17 100644
--- a/main/solenv/inc/unxfbsd.mk
+++ b/main/solenv/inc/unxfbsd.mk
@@ -37,6 +37,9 @@ JAVAFLAGSDEBUG=-g
 .IF "$(CPUNAME)" == "X86_64"
 .INCLUDE : unxfbsdx.mk
 .ENDIF
+.IF "$(CPUNAME)" == "POWERPC64"
+.INCLUDE : unxfbsdp.mk
+.ENDIF
 .IF "$(CPUNAME)" == "POWERPC"
 .INCLUDE : unxfbsdppc.mk
 .ENDIF
diff --git a/main/testtools/source/bridgetest/makefile.mk b/main/testtools/source/bridgetest/makefile.mk
index 1c0e848..b13e87a 100644
--- a/main/testtools/source/bridgetest/makefile.mk
+++ b/main/testtools/source/bridgetest/makefile.mk
@@ -134,7 +134,7 @@ ALLTAR: \
 
 runtest : $(DLLDEST)$/uno_types.rdb $(DLLDEST)$/uno_services.rdb makefile.mk \
         $(SHL1TARGETN) $(SHL2TARGETN) $(SHL3TARGETN)
-.IF "$(COM)$(OS)$(CPU)" == "GCCMACOSXP" || "$(OS)$(CPU)"=="SOLARISS"
+.IF "$(COM)$(OS)$(CPU)" == "GCCMACOSXP" || "$(OS)$(CPU)"=="SOLARISS" || "$(COM)$(OS)$(CPU)"=="GCCFREEBSDP"
 	@echo "Mac OSX PPC GCC and Solaris fails this test! likely broken UNO bridge. Fix me."
 .ELSE
         cd $(DLLDEST) && $(AUGMENT_LIBRARY_PATH) $(SOLARBINDIR)/uno \


[openoffice] 04/07: Some more Initial support for the FreeBSD ARM platform.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit 08797115ce0f707eb70a34fa2507134d1bb690a5
Author: pfg <pf...@13f79535-47bb-0310-9956-ffa450edef68>
AuthorDate: Tue Jan 3 05:32:49 2017 +0000

    Some more Initial support for the FreeBSD ARM platform.
    
    Minor adjustments; still untested.
    
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1777067 13f79535-47bb-0310-9956-ffa450edef68
---
 main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk | 2 +-
 main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx | 2 +-
 main/desktop/source/deployment/misc/dp_platform.cxx      | 1 +
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
index 1672cdf..39df3a4 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
@@ -35,7 +35,7 @@ NO_BSYMBOLIC=TRUE
 
 # --- Files --------------------------------------------------------
 
-.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCLINUXRgcc3"
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCFREEBSDRgcc3"
 
 .IF "$(cppu_no_leak)" == ""
 CFLAGS += -DLEAK_STATIC_DATA
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx
index daf14dc..d5ab980 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx
@@ -21,7 +21,7 @@
 
 
 
-#include <malloc.h>
+#include <stdlib.h>
 #include <rtl/alloc.h>
 
 #include <com/sun/star/uno/genfunc.hxx>
diff --git a/main/desktop/source/deployment/misc/dp_platform.cxx b/main/desktop/source/deployment/misc/dp_platform.cxx
index 5fee74d..2c40fbe 100644
--- a/main/desktop/source/deployment/misc/dp_platform.cxx
+++ b/main/desktop/source/deployment/misc/dp_platform.cxx
@@ -56,6 +56,7 @@
 #define PLATFORM_SOLARIS_SPARC      "solaris_sparc"
 #define PLATFORM_SOLARIS_SPARC64    "solaris_sparc64"
 #define PLATFORM_SOLARIS_X86        "solaris_x86"
+#define PLATFORM_FREEBSD_ARM        "freebsd_arm"
 #define PLATFORM_FREEBSD_POWERPC    "freebsd_powerpc"
 #define PLATFORM_FREEBSD_POWERPC64  "freebsd_powerpc64"
 #define PLATFORM_FREEBSD_X86        "freebsd_x86"


[openoffice] 06/07: freebsd-arm: obvious fix.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit 44db7cb5cea090dff31d4a8b466798cd4362509d
Author: Pedro Giffuni <pf...@apache.org>
AuthorDate: Sun Oct 1 04:53:39 2017 +0000

    freebsd-arm: obvious fix.
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1810249 13f79535-47bb-0310-9956-ffa450edef68
---
 main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx
index bcc5f8e..f6b1ff2 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx
@@ -21,7 +21,7 @@
 
 
 
-#include <malloc.h>
+#include <stdlib.h>
 #include <hash_map>
 
 #include <rtl/alloc.h>


[openoffice] 03/07: Initial support for the FreeBSD ARM platform.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit 0bd9e244a1c349a04bd0330cfab559b72298733c
Author: pfg <pf...@13f79535-47bb-0310-9956-ffa450edef68>
AuthorDate: Tue Jan 3 04:15:40 2017 +0000

    Initial support for the FreeBSD ARM platform.
    
    This is just the skeleton, basically a copy of the linux support.
    It wouldn't be surprising if it works without much trouble.
    
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1777057 13f79535-47bb-0310-9956-ffa450edef68
---
 .../source/cpp_uno/gcc3_freebsd_arm/armhelper.S    |  57 ++
 .../source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx    | 546 +++++++++++++++++
 .../source/cpp_uno/gcc3_freebsd_arm/except.cxx     | 337 +++++++++++
 .../source/cpp_uno/gcc3_freebsd_arm/makefile.mk    |  80 +++
 .../source/cpp_uno/gcc3_freebsd_arm/share.hxx      |  96 +++
 .../source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx    | 665 +++++++++++++++++++++
 main/set_soenv.in                                  |  11 +
 main/solenv/inc/unxfbsd.mk                         |   3 +
 main/solenv/inc/unxfbsdr.mk                        |  46 ++
 9 files changed, 1841 insertions(+)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/armhelper.S b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/armhelper.S
new file mode 100644
index 0000000..577403d
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/armhelper.S
@@ -0,0 +1,57 @@
+@   
+@   Licensed to the Apache Software Foundation (ASF) under one
+@   or more contributor license agreements.  See the NOTICE file
+@   distributed with this work for additional information
+@   regarding copyright ownership.  The ASF licenses this file
+@   to you under the Apache License, Version 2.0 (the
+@   "License"); you may not use this file except in compliance
+@   with the License.  You may obtain a copy of the License at
+@   
+@     http://www.apache.org/licenses/LICENSE-2.0
+@   
+@   Unless required by applicable law or agreed to in writing,
+@   software distributed under the License is distributed on an
+@   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@   KIND, either express or implied.  See the License for the
+@   specific language governing permissions and limitations
+@   under the License.
+@  
+
+@ ARM support code for OpenOffice C++/UNO bridging
+@
+@ Written by Peter Naulls <pe...@chocky.org>
+@ Modified by Caolan McNamara <ca...@redhat.com>
+@ Fixed by Michael Casadevall <mc...@kubuntu.org>
+
+#ifdef __ARM_EABI__
+#  define UNWIND
+#else
+#  define UNWIND @
+#endif
+
+	.file	"armhelper.s"
+	.text
+	.align	4
+	.global privateSnippetExecutor
+	.type privateSnippetExecutor, %function
+privateSnippetExecutor:
+	UNWIND .fnstart            @ start of unwinder entry
+
+	stmfd sp!, {r0-r3}         @ follow other parameters on stack
+	UNWIND .pad  #16           @ throw this data away on exception
+	mov   r0, ip               @ r0 points to functionoffset/vtable
+	mov   r1, sp               @ r1 points to this and params
+	                           @ (see cppuno.cxx:codeSnippet())
+	stmfd sp!, {r4,lr}         @ save return address 
+	                           @ (r4 pushed to preserve stack alignment)
+	UNWIND .save {r4,lr}       @ restore these regs on exception
+
+	bl    cpp_vtable_call(PLT)
+
+	add   sp, sp, #4           @ no need to restore r4 (we didn't touch it)
+	ldr   pc, [sp], #20        @ return, discarding function arguments
+
+	UNWIND .fnend              @ end of unwinder entry
+
+	.size privateSnippetExecutor, . - privateSnippetExecutor
+        .section        .note.GNU-stack,"",%progbits
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx
new file mode 100644
index 0000000..bcc5f8e
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/cpp2uno.cxx
@@ -0,0 +1,546 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+#include <malloc.h>
+#include <hash_map>
+
+#include <rtl/alloc.h>
+#include <osl/mutex.hxx>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include "com/sun/star/uno/RuntimeException.hpp"
+#include <uno/data.h>
+#include <typelib/typedescription.hxx>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+
+#include "share.hxx"
+
+#include <dlfcn.h>
+
+
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+    static typelib_TypeClass cpp2uno_call(
+        bridges::cpp_uno::shared::CppInterfaceProxy* pThis,
+        const typelib_TypeDescription * pMemberTypeDescr,
+        typelib_TypeDescriptionReference * pReturnTypeRef, 
+        sal_Int32 nParams, typelib_MethodParameter * pParams,
+        void ** pCallStack,
+        sal_Int64 * pRegisterReturn /* space for register return */ )
+    {
+        // pCallStack: ret, [return ptr], this, params
+        char * pTopStack = (char *)(pCallStack + 0);
+        char * pCppStack = pTopStack;
+
+        // return
+        typelib_TypeDescription * pReturnTypeDescr = 0;
+        if (pReturnTypeRef)
+            TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+        
+        void * pUnoReturn = 0;
+        // complex return ptr: if != 0 && != pUnoReturn, reconversion need
+        void * pCppReturn = 0;
+        
+        if (pReturnTypeDescr)
+        {
+            if (!arm::return_in_hidden_param(pReturnTypeRef))
+                pUnoReturn = pRegisterReturn; // direct way for simple types
+            else // complex return via ptr (pCppReturn)
+            {
+                pCppReturn = *(void **)pCppStack;
+                pCppStack += sizeof(void *);
+                
+                pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType(
+                    pReturnTypeDescr )
+                        ? alloca( pReturnTypeDescr->nSize )
+                        : pCppReturn); // direct way
+            }
+        }
+        // pop this
+        pCppStack += sizeof( void* );
+
+        // stack space
+        OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32),
+            "### unexpected size!" );
+        // parameters
+        void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
+        void ** pCppArgs = pUnoArgs + nParams;
+        // indizes of values this have to be converted (interface conversion
+        // cpp<=>uno)
+        sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+        // type descriptions for reconversions
+        typelib_TypeDescription ** ppTempParamTypeDescr = 
+            (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
+        
+        sal_Int32 nTempIndizes   = 0;
+
+        for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+        {
+            const typelib_MethodParameter & rParam = pParams[nPos];
+            typelib_TypeDescription * pParamTypeDescr = 0;
+            TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+            if (!rParam.bOut && 
+                bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) 
+            {
+#ifdef __ARM_EABI__
+                switch (pParamTypeDescr->eTypeClass)
+                {
+                    case typelib_TypeClass_HYPER:
+                    case typelib_TypeClass_UNSIGNED_HYPER:
+                    case typelib_TypeClass_DOUBLE:
+			if ((pCppStack - pTopStack) % 8) pCppStack+=sizeof(sal_Int32); //align to 8
+                        break;
+                    default:
+                        break;
+                }
+#endif
+
+                pCppArgs[nPos] = pCppStack;
+                pUnoArgs[nPos] = pCppStack;
+                switch (pParamTypeDescr->eTypeClass)
+                {
+                    case typelib_TypeClass_HYPER:
+                    case typelib_TypeClass_UNSIGNED_HYPER:
+                    case typelib_TypeClass_DOUBLE:
+                        pCppStack += sizeof(sal_Int32); // extra long
+                        break;
+                    default:
+                        break;
+                }
+                // no longer needed
+                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+            }
+            else // ptr to complex value | ref
+            {
+                pCppArgs[nPos] = *(void **)pCppStack;
+
+                if (! rParam.bIn) // is pure out
+                {
+                    // uno out is unconstructed mem!
+                    pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
+                    pTempIndizes[nTempIndizes] = nPos;
+                    // will be released at reconversion
+                    ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+                }
+                // is in/inout
+                else if (bridges::cpp_uno::shared::relatesToInterfaceType(
+                    pParamTypeDescr ))
+                {
+                    uno_copyAndConvertData( pUnoArgs[nPos] = 
+                        alloca( pParamTypeDescr->nSize ),
+                        *(void **)pCppStack, pParamTypeDescr,
+                        pThis->getBridge()->getCpp2Uno() );
+                    pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+                    // will be released at reconversion
+                    ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+                }
+                else // direct way
+                {
+                    pUnoArgs[nPos] = *(void **)pCppStack;
+                    // no longer needed
+                    TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+                }
+            }
+            pCppStack += sizeof(sal_Int32); // standard parameter length
+        }
+        
+        // ExceptionHolder
+        uno_Any aUnoExc; // Any will be constructed by callee
+        uno_Any * pUnoExc = &aUnoExc;
+
+        // invoke uno dispatch call
+        (*pThis->getUnoI()->pDispatcher)(
+          pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+
+        // in case an exception occurred...
+        if (pUnoExc)
+        {
+            // destruct temporary in/inout params
+            for ( ; nTempIndizes--; )
+            {
+                sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+                
+                if (pParams[nIndex].bIn) // is in/inout => was constructed
+                    uno_destructData( pUnoArgs[nIndex], 
+                        ppTempParamTypeDescr[nTempIndizes], 0 );
+                TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+            }
+            if (pReturnTypeDescr)
+                TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+            
+            CPPU_CURRENT_NAMESPACE::raiseException( &aUnoExc, 
+                pThis->getBridge()->getUno2Cpp() ); // has to destruct the any
+            // is here for dummy
+            return typelib_TypeClass_VOID;
+        }
+        else // else no exception occurred...
+        {
+            // temporary params
+            for ( ; nTempIndizes--; )
+            {
+                sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+                typelib_TypeDescription * pParamTypeDescr =
+                    ppTempParamTypeDescr[nTempIndizes];
+                
+                if (pParams[nIndex].bOut) // inout/out
+                {
+                    // convert and assign
+                    uno_destructData( pCppArgs[nIndex], pParamTypeDescr,
+                        cpp_release );
+                    uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], 
+                        pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
+                }
+                // destroy temp uno param
+                uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
+                
+                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+            }
+            // return
+            if (pCppReturn) // has complex return
+            {
+                if (pUnoReturn != pCppReturn) // needs reconversion
+                {
+                    uno_copyAndConvertData( pCppReturn, pUnoReturn,
+                        pReturnTypeDescr, pThis->getBridge()->getUno2Cpp() );
+                    // destroy temp uno return
+                    uno_destructData( pUnoReturn, pReturnTypeDescr, 0 );
+                }
+                // complex return ptr is set to eax
+                *(void **)pRegisterReturn = pCppReturn;
+            }
+            if (pReturnTypeDescr)
+            {
+                typelib_TypeClass eRet =
+                    (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
+                TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+                return eRet;
+            }
+            else
+                return typelib_TypeClass_VOID;
+        }
+    }
+
+
+    //=====================================================================
+    static typelib_TypeClass cpp_mediate(
+        sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset,
+        void ** pCallStack,
+        sal_Int64 * pRegisterReturn /* space for register return */ )
+    {
+        OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
+
+        // pCallStack: [ret *], this, params
+        // _this_ ptr is patched cppu_XInterfaceProxy object
+        void *pThis;
+        if( nFunctionIndex & 0x80000000 )
+        {
+            nFunctionIndex &= 0x7fffffff;
+            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 );
+        }
+        
+        // determine called method
+        OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex,
+            "### illegal vtable index!" );
+        sal_Int32 nMemberPos =
+            pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
+        OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers,
+            "### illegal member index!" );
+
+        TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
+
+        typelib_TypeClass eRet;
+        switch (aMemberDescr.get()->eTypeClass)
+        {
+        case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+        {
+            if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] ==
+                nFunctionIndex)
+            {
+                // is GET method
+                eRet = cpp2uno_call(
+                    pCppI, aMemberDescr.get(),
+                    ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef,
+                    0, 0, // no params
+                    pCallStack, pRegisterReturn );
+            }
+            else
+            {
+                // is SET method
+                typelib_MethodParameter aParam;
+                aParam.pTypeRef =
+                    ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef;
+                aParam.bIn      = sal_True;
+                aParam.bOut     = sal_False;
+                
+                eRet = cpp2uno_call(
+                    pCppI, aMemberDescr.get(),
+                    0, // indicates void return
+                    1, &aParam,
+                    pCallStack, pRegisterReturn );
+            }
+            break;
+        }
+        case typelib_TypeClass_INTERFACE_METHOD:
+        {
+            // is METHOD
+            switch (nFunctionIndex)
+            {
+            case 1: // acquire()
+                pCppI->acquireProxy(); // non virtual call!
+                eRet = typelib_TypeClass_VOID;
+                break;
+            case 2: // release()
+                pCppI->releaseProxy(); // non virtual call!
+                eRet = typelib_TypeClass_VOID;
+                break;
+            case 0: // queryInterface() opt
+            {
+                typelib_TypeDescription * pTD = 0;
+                TYPELIB_DANGER_GET(&pTD,
+                    reinterpret_cast<Type *>(pCallStack[2])->getTypeLibType());
+                if (pTD)
+                {
+                    XInterface * pInterface = 0;
+                    (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
+                        pCppI->getBridge()->getCppEnv(),
+                        (void **)&pInterface, pCppI->getOid().pData,
+                        (typelib_InterfaceTypeDescription *)pTD );
+                
+                    if (pInterface)
+                    {
+                        ::uno_any_construct(
+                            reinterpret_cast< uno_Any * >( pCallStack[0] ),
+                            &pInterface, pTD, cpp_acquire );
+                        pInterface->release();
+                        TYPELIB_DANGER_RELEASE( pTD );
+                        *(void **)pRegisterReturn = pCallStack[0];
+                        eRet = typelib_TypeClass_ANY;
+                        break;
+                    }
+                    TYPELIB_DANGER_RELEASE( pTD );
+                }
+            } // else perform queryInterface()
+            default:
+                eRet = cpp2uno_call(
+                    pCppI, aMemberDescr.get(),
+                    ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef,
+                    ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams,
+                    ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams,
+                    pCallStack, pRegisterReturn );
+            }
+            break;
+        }
+        default:
+        {
+            throw RuntimeException(
+                OUString::createFromAscii("no member description found!"),
+                (XInterface *)pCppI );
+            // is here for dummy
+            eRet = typelib_TypeClass_VOID;
+        }
+        }
+
+        return eRet;
+    }
+}
+
+//=======================================================================
+/**
+ * is called on incoming vtable calls
+ * (called by asm snippets)
+ */
+
+extern "C" sal_Int64 cpp_vtable_call( long *pFunctionAndOffset, 
+    void **pCallStack )
+{
+    sal_Int64 nRegReturn;
+    typelib_TypeClass aType = cpp_mediate( pFunctionAndOffset[0], pFunctionAndOffset[1], pCallStack,
+        &nRegReturn );
+
+    switch( aType )
+    {
+        case typelib_TypeClass_BOOLEAN:
+        case typelib_TypeClass_BYTE:
+            nRegReturn = (unsigned long)(*(unsigned char *)&nRegReturn);
+            break;
+        case typelib_TypeClass_CHAR:
+        case typelib_TypeClass_UNSIGNED_SHORT:
+        case typelib_TypeClass_SHORT:
+            nRegReturn = (unsigned long)(*(unsigned short *)&nRegReturn);
+            break;
+        case typelib_TypeClass_ENUM:
+        case typelib_TypeClass_UNSIGNED_LONG:
+        case typelib_TypeClass_LONG:
+            nRegReturn = (unsigned long)(*(unsigned int *)&nRegReturn);
+            break;
+        case typelib_TypeClass_VOID:
+        default:
+            break;
+    }
+
+    return nRegReturn;
+}
+
+extern "C" void privateSnippetExecutor(void);
+
+namespace
+{
+    const int codeSnippetSize = 20;
+
+    unsigned char *codeSnippet(unsigned char* code, sal_Int32 functionIndex, 
+        sal_Int32 vtableOffset, bool bHasHiddenParam)
+    {
+        if (bHasHiddenParam)
+            functionIndex |= 0x80000000;
+
+        unsigned long * p = (unsigned long *)code;
+
+        *p++ = 0xE1A0C00F;
+        *p++ = 0xE59FF004;
+        *p++ = (unsigned long)functionIndex;
+        *p++ = (unsigned long)vtableOffset;
+        *p++ = (unsigned long)privateSnippetExecutor;
+
+        return code + codeSnippetSize;
+    }
+}
+
+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+{
+    return static_cast< Slot * >(block) + 2;
+}
+
+sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+    sal_Int32 slotCount)
+{
+    return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize;
+}
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::initializeBlock(
+    void * block, sal_Int32 slotCount)
+{
+    Slot * slots = mapBlockToVtable(block);
+    slots[-2].fn = 0;
+    slots[-1].fn = 0;
+    return slots + slotCount;
+}
+
+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+    Slot ** slots, unsigned char * code, sal_PtrDiff writetoexecdiff,
+    typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset,
+    sal_Int32 functionCount, sal_Int32 vtableOffset)
+{
+    (*slots) -= functionCount;
+    Slot * s = *slots;
+    for (sal_Int32 i = 0; i < type->nMembers; ++i)
+    {
+        typelib_TypeDescription * member = 0;
+        TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
+        OSL_ASSERT(member != 0);
+        switch (member->eTypeClass)
+        {
+            case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+            {
+                typelib_InterfaceAttributeTypeDescription *pAttrTD =
+                    reinterpret_cast<typelib_InterfaceAttributeTypeDescription *>( member );
+
+                // Getter:
+                (s++)->fn = code + writetoexecdiff;
+                code = codeSnippet(
+                    code, functionOffset++, vtableOffset,
+                    arm::return_in_hidden_param( pAttrTD->pAttributeTypeRef ));
+
+                // Setter:
+                if (!pAttrTD->bReadOnly)
+                {
+                    (s++)->fn = code + writetoexecdiff;
+                    code = codeSnippet(
+                        code, functionOffset++, vtableOffset, false);
+                }
+                break;
+            }
+            case typelib_TypeClass_INTERFACE_METHOD:
+            {
+                (s++)->fn = code + writetoexecdiff;
+
+                typelib_InterfaceMethodTypeDescription *pMethodTD = 
+                    reinterpret_cast<
+                        typelib_InterfaceMethodTypeDescription * >(member);
+
+                code = codeSnippet(code, functionOffset++, vtableOffset,
+                    arm::return_in_hidden_param(pMethodTD->pReturnTypeRef));
+                break;
+            }
+        default:
+            OSL_ASSERT(false);
+            break;
+        }
+        TYPELIB_DANGER_RELEASE(member);
+    }
+    return code;
+}
+
+void bridges::cpp_uno::shared::VtableFactory::flushCode(
+    unsigned char const *beg, unsigned char const *end)
+{
+   static void (*clear_cache)(unsigned char const*, unsigned char const*)
+       = (void (*)(unsigned char const*, unsigned char const*))
+           dlsym(RTLD_DEFAULT, "__clear_cache");    
+   (*clear_cache)(beg, end);
+}
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/except.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/except.cxx
new file mode 100644
index 0000000..981fa41
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/except.cxx
@@ -0,0 +1,337 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <cxxabi.h>
+#include <hash_map>
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <osl/diagnose.h>
+#include <osl/mutex.hxx>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include "com/sun/star/uno/RuntimeException.hpp"
+#include <typelib/typedescription.hxx>
+#include <uno/any2.h>
+
+#include "share.hxx"
+
+
+using namespace ::std;
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+using namespace ::__cxxabiv1;
+
+extern sal_Int32 * pHack;
+extern sal_Int32 nHack;
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+    void dummy_can_throw_anything( char const * )
+    {
+    }
+
+    //===================================================================
+    static OUString toUNOname( char const * p ) SAL_THROW( () )
+    {
+#if OSL_DEBUG_LEVEL > 1
+        char const * start = p;
+#endif
+
+        // example: N3com3sun4star4lang24IllegalArgumentExceptionE
+
+        OUStringBuffer buf( 64 );
+        OSL_ASSERT( 'N' == *p );
+        ++p; // skip N
+
+        while ('E' != *p)
+        {
+            // read chars count
+            long n = (*p++ - '0');
+            while ('0' <= *p && '9' >= *p)
+            {
+                n *= 10;
+                n += (*p++ - '0');
+            }
+            buf.appendAscii( p, n );
+            p += n;
+            if ('E' != *p)
+                buf.append( (sal_Unicode)'.' );
+        }
+
+#if OSL_DEBUG_LEVEL > 1
+        OUString ret( buf.makeStringAndClear() );
+        OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
+        fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
+        return ret;
+#else
+        return buf.makeStringAndClear();
+#endif
+    }
+
+    //=====================================================================
+    class RTTI
+    {
+        typedef hash_map< OUString, type_info *, OUStringHash > t_rtti_map;
+
+        Mutex m_mutex;
+        t_rtti_map m_rttis;
+        t_rtti_map m_generatedRttis;
+
+        void * m_hApp;
+
+    public:
+        RTTI() SAL_THROW( () );
+        ~RTTI() SAL_THROW( () );
+
+        type_info * getRTTI(typelib_CompoundTypeDescription *) SAL_THROW( () );
+    };
+    //____________________________________________________________________
+    RTTI::RTTI() SAL_THROW( () )
+        : m_hApp( dlopen( 0, RTLD_LAZY ) )
+    {
+    }
+    //____________________________________________________________________
+    RTTI::~RTTI() SAL_THROW( () )
+    {
+        dlclose( m_hApp );
+    }
+
+    //____________________________________________________________________
+    type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) SAL_THROW( () )
+    {
+        type_info * rtti;
+
+        OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName;
+
+        MutexGuard guard( m_mutex );
+        t_rtti_map::const_iterator iFind( m_rttis.find( unoName ) );
+        if (iFind == m_rttis.end())
+        {
+            // RTTI symbol
+            OStringBuffer buf( 64 );
+            buf.append( RTL_CONSTASCII_STRINGPARAM("_ZTIN") );
+            sal_Int32 index = 0;
+            do
+            {
+                OUString token( unoName.getToken( 0, '.', index ) );
+                buf.append( token.getLength() );
+                OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) );
+                buf.append( c_token );
+            }
+            while (index >= 0);
+            buf.append( 'E' );
+
+            OString symName( buf.makeStringAndClear() );
+            rtti = (type_info *)dlsym( m_hApp, symName.getStr() );
+
+            if (rtti)
+            {
+                pair< t_rtti_map::iterator, bool > insertion(
+                    m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+                OSL_ENSURE( insertion.second, "### inserting new rtti failed?!" );
+            }
+            else
+            {
+                // try to lookup the symbol in the generated rtti map
+                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,
+                    // the symbol is prefixed with _ZTI
+                    char const * rttiName = symName.getStr() +4;
+#if OSL_DEBUG_LEVEL > 1
+                    fprintf( stderr,"generated rtti for %s\n", rttiName );
+#endif
+                    if (pTypeDescr->pBaseTypeDescription)
+                    {
+                        // ensure availability of base
+                        type_info * base_rtti = getRTTI(
+                            (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription );
+                        rtti = new __si_class_type_info(
+                            strdup( rttiName ), (__class_type_info *)base_rtti );
+                    }
+                    else
+                    {
+                        // this class has no base class
+                        rtti = new __class_type_info( strdup( rttiName ) );
+                    }
+
+                    pair< t_rtti_map::iterator, bool > insertion(
+                        m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
+                    OSL_ENSURE( insertion.second, "### inserting new generated rtti failed?!" );
+                }
+                else // taking already generated rtti
+                {
+                    rtti = iFind2->second;
+                }
+            }
+        }
+        else
+        {
+            rtti = iFind->second;
+        }
+
+        return rtti;
+    }
+
+    //------------------------------------------------------------------
+    static void deleteException( void * pExc )
+    {
+        __cxa_exception const * header = ((__cxa_exception const *)pExc - 1);
+        typelib_TypeDescription * pTD = 0;
+        OUString unoName( toUNOname( header->exceptionType->name() ) );
+        ::typelib_typedescription_getByName( &pTD, unoName.pData );
+        OSL_ENSURE( pTD, "### unknown exception type! leaving out destruction => leaking!!!" );
+        if (pTD)
+        {
+            ::uno_destructData( pExc, pTD, cpp_release );
+            ::typelib_typedescription_release( pTD );
+        }
+    }
+
+    //==================================================================
+    void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
+    {
+#if OSL_DEBUG_LEVEL > 1
+        OString cstr(
+            OUStringToOString(
+                *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
+                RTL_TEXTENCODING_ASCII_US ) );
+        fprintf( stderr, "> uno exception occurred: %s\n", cstr.getStr() );
+#endif
+        void * pCppExc;
+        type_info * rtti;
+
+        {
+        // construct cpp exception object
+        typelib_TypeDescription * pTypeDescr = 0;
+        TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
+        OSL_ASSERT( pTypeDescr );
+        if (! pTypeDescr)
+        {
+            throw RuntimeException(
+                OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get typedescription for type ") ) +
+                *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
+                Reference< XInterface >() );
+        }
+
+        pCppExc = __cxa_allocate_exception( pTypeDescr->nSize );
+        ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
+
+        // destruct uno exception
+        ::uno_any_destruct( pUnoExc, 0 );
+        // avoiding locked counts
+        static RTTI * s_rtti = 0;
+        if (! s_rtti)
+        {
+            MutexGuard guard( Mutex::getGlobalMutex() );
+            if (! s_rtti)
+            {
+#ifdef LEAK_STATIC_DATA
+                s_rtti = new RTTI();
+#else
+                static RTTI rtti_data;
+                s_rtti = &rtti_data;
+#endif
+            }
+        }
+        rtti = (type_info *)s_rtti->getRTTI( (typelib_CompoundTypeDescription *) pTypeDescr );
+        TYPELIB_DANGER_RELEASE( pTypeDescr );
+        OSL_ENSURE( rtti, "### no rtti for throwing exception!" );
+        if (! rtti)
+        {
+            throw RuntimeException(
+                OUString( RTL_CONSTASCII_USTRINGPARAM("no rtti for type ") ) +
+                *reinterpret_cast< OUString const * >( &pUnoExc->pType->pTypeName ),
+                Reference< XInterface >() );
+        }
+        }
+
+
+	__cxa_throw( pCppExc, rtti, deleteException );
+    }
+
+#ifdef __ARM_EABI__
+    static void* getAdjustedPtr(__cxa_exception* header)
+    {
+        return (void*)header->unwindHeader.barrier_cache.bitpattern[0];
+    }
+#else
+    static void* getAdjustedPtr(__cxa_exception* header)
+    {
+        return header->adjustedPtr;
+    }
+#endif
+
+    //===================================================================
+    void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+    {
+        if (! header)
+        {
+            RuntimeException aRE(
+                OUString( RTL_CONSTASCII_USTRINGPARAM("no exception header!") ),
+                Reference< XInterface >() );
+            Type const & rType = ::getCppuType( &aRE );
+            uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
+#if OSL_DEBUG_LEVEL > 0
+            OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
+            OSL_ENSURE( 0, cstr.getStr() );
+#endif
+            return;
+        }
+
+        typelib_TypeDescription * pExcTypeDescr = 0;
+        OUString unoName( toUNOname( header->exceptionType->name() ) );
+#if OSL_DEBUG_LEVEL > 1
+        OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
+        fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
+#endif
+        typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
+        if (0 == pExcTypeDescr)
+        {
+            RuntimeException aRE(
+                OUString( RTL_CONSTASCII_USTRINGPARAM("exception type not found: ") ) + unoName,
+                Reference< XInterface >() );
+            Type const & rType = ::getCppuType( &aRE );
+            uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno );
+#if OSL_DEBUG_LEVEL > 0
+            OString cstr( OUStringToOString( aRE.Message, RTL_TEXTENCODING_ASCII_US ) );
+            OSL_ENSURE( 0, cstr.getStr() );
+#endif
+        }
+        else
+        {
+            // construct uno exception any
+            uno_any_constructAndConvert( pUnoExc, getAdjustedPtr(header), pExcTypeDescr, pCpp2Uno );
+            typelib_typedescription_release( pExcTypeDescr );
+        }
+    }
+}
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
new file mode 100644
index 0000000..1672cdf
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
@@ -0,0 +1,80 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+PRJ=..$/..$/..
+
+PRJNAME=bridges
+TARGET=gcc3_uno
+LIBTARGET=no
+ENABLE_EXCEPTIONS=TRUE
+NO_BSYMBOLIC=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE :  settings.mk
+
+# --- Files --------------------------------------------------------
+
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCLINUXRgcc3"
+
+.IF "$(cppu_no_leak)" == ""
+CFLAGS += -DLEAK_STATIC_DATA
+.ENDIF
+
+CFLAGSCXX += -fno-omit-frame-pointer 
+
+NOOPTFILES= \
+	$(SLO)$/cpp2uno.obj \
+	$(SLO)$/except.obj \
+	$(SLO)$/uno2cpp.obj
+
+CFLAGSNOOPT=-O0
+
+SLOFILES= \
+	$(SLO)$/cpp2uno.obj \
+	$(SLO)$/except.obj \
+	$(SLO)$/uno2cpp.obj \
+	$(SLO)$/armhelper.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1IMPLIB=i$(TARGET)
+SHL1VERSIONMAP=..$/..$/bridge_exports.map
+SHL1RPATH=URELIB
+
+SHL1OBJS = $(SLOFILES)
+SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
+
+SHL1STDLIBS= \
+	$(CPPULIB)			\
+	$(SALLIB)
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :  target.mk
+
+$(SLO)$/%.obj: %.S
+       $(CXX) -c -o $(SLO)$/$(@:b).o $< -fPIC ; touch $@
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/share.hxx b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/share.hxx
new file mode 100644
index 0000000..df4e6dc
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/share.hxx
@@ -0,0 +1,96 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+#ifndef _ARM_SHARE_HXX
+#define _ARM_SHARE_HXX
+#include "uno/mapping.h"
+
+#include <typeinfo>
+#include <exception>
+#include <cstddef>
+#include <unwind.h>
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+    void dummy_can_throw_anything( char const * );
+
+    // -- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
+
+    struct __cxa_exception
+    { 
+        ::std::type_info *exceptionType;
+        void (*exceptionDestructor)(void *); 
+        
+        ::std::unexpected_handler unexpectedHandler;
+        ::std::terminate_handler terminateHandler;
+        
+        __cxa_exception *nextException;
+        
+        int handlerCount;
+#ifdef __ARM_EABI__
+	__cxa_exception *nextPropagatingException;
+	int propagationCount;
+#else
+        int handlerSwitchValue;
+        const unsigned char *actionRecord;
+        const unsigned char *languageSpecificData;
+        void *catchTemp;
+        void *adjustedPtr;
+#endif    
+        _Unwind_Exception unwindHeader;
+    };    
+
+    extern "C" void *__cxa_allocate_exception(
+        std::size_t thrown_size ) throw();
+    extern "C" void __cxa_throw (
+        void *thrown_exception, std::type_info *tinfo, 
+        void (*dest) (void *) ) __attribute__((noreturn));
+
+    struct __cxa_eh_globals
+    {
+        __cxa_exception *caughtExceptions;
+        unsigned int uncaughtExceptions;
+#ifdef __ARM_EABI__
+	__cxa_exception *propagatingExceptions;
+#endif
+    };
+    extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+
+    // -----
+
+    //====================================================================
+    void raiseException(
+        uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
+    //====================================================================
+    void fillUnoException(
+        __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+}
+
+namespace arm
+{
+    enum armlimits { MAX_GPR_REGS = 4 };
+    bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
+}
+
+#endif
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx
new file mode 100644
index 0000000..daf14dc
--- /dev/null
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/uno2cpp.cxx
@@ -0,0 +1,665 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+#include <malloc.h>
+#include <rtl/alloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include "com/sun/star/uno/RuntimeException.hpp"
+#include <uno/data.h>
+
+#include <bridges/cpp_uno/shared/bridge.hxx>
+#include <bridges/cpp_uno/shared/types.hxx>
+#include <bridges/cpp_uno/shared/unointerfaceproxy.hxx>
+#include <bridges/cpp_uno/shared/vtables.hxx>
+
+#include "share.hxx"
+
+#include <stdio.h>
+#include <string.h>
+
+/* 
+ * Based on http://gcc.gnu.org/PR41443
+ * References to __SOFTFP__ are incorrect for EABI; the __SOFTFP__ code
+ * should be used for *soft-float ABI* whether or not VFP is enabled,
+ * and __SOFTFP__ does specifically mean soft-float not soft-float ABI.
+ *
+ * Changing the conditionals to __SOFTFP__ || __ARM_EABI__ then 
+ * -mfloat-abi=softfp should work.  -mfloat-abi=hard won't; that would
+ * need both a new macro to identify the hard-VFP ABI.
+ */
+#if !defined(__ARM_EABI__) && !defined(__SOFTFP__)
+#error Not Implemented
+
+/*
+ some possibly handy code to detect that we have VFP registers
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <elf.h>
+
+#define HWCAP_ARM_VFP 64
+
+int hasVFP(void)
+{
+    int fd = open ("/proc/self/auxv", O_RDONLY);
+    if (fd == -1)
+        return -1;
+
+    int ret = -1;
+
+    Elf32_auxv_t buf[128];
+    ssize_t n;
+    while ((ret == -1) && ((n = read(fd, buf, sizeof (buf))) > 0))
+    {
+        for (int i = 0; i < 128; ++i)
+        {
+	    if (buf[i].a_type == AT_HWCAP)
+	    {
+                ret = (buf[i].a_un.a_val & HWCAP_ARM_VFP) ? true : false;
+                break;
+	    }
+            else if (buf[i].a_type == AT_NULL)
+            {
+                ret = -2;
+                break;
+            }
+        }
+    }
+
+    close (fd);
+    return ret;
+}
+
+#endif
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+namespace arm
+{
+    bool is_complex_struct(const typelib_TypeDescription * type)
+    {
+        const typelib_CompoundTypeDescription * p
+            = reinterpret_cast< const typelib_CompoundTypeDescription * >(type);
+        for (sal_Int32 i = 0; i < p->nMembers; ++i)
+        {
+            if (p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_STRUCT ||
+                p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_EXCEPTION)
+            {
+                typelib_TypeDescription * t = 0;
+                TYPELIB_DANGER_GET(&t, p->ppTypeRefs[i]);
+                bool b = is_complex_struct(t);
+                TYPELIB_DANGER_RELEASE(t);
+                if (b) {
+                    return true;
+                }
+            }
+            else if (!bridges::cpp_uno::shared::isSimpleType(p->ppTypeRefs[i]->eTypeClass))
+                return true;
+        }
+        if (p->pBaseTypeDescription != 0)
+            return is_complex_struct(&p->pBaseTypeDescription->aBase);
+        return false;
+    }
+
+    bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef )
+    {
+        if (bridges::cpp_uno::shared::isSimpleType(pTypeRef))
+            return false;
+        else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
+        {
+            typelib_TypeDescription * pTypeDescr = 0;
+            TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
+
+            //A Composite Type not larger than 4 bytes is returned in r0
+            bool bRet = pTypeDescr->nSize > 4 || is_complex_struct(pTypeDescr);
+
+            TYPELIB_DANGER_RELEASE( pTypeDescr );
+            return bRet;
+        }
+        return true;
+    }
+}
+
+void MapReturn(sal_uInt32 r0, sal_uInt32 r1, typelib_TypeDescriptionReference * pReturnType, sal_uInt32* pRegisterReturn)
+{
+#if !defined(__ARM_EABI__) && !defined(__SOFTFP__)
+    register float fret asm("f0");
+    register double dret asm("f0");
+#endif
+
+    switch( pReturnType->eTypeClass )
+    {
+        case typelib_TypeClass_HYPER:
+        case typelib_TypeClass_UNSIGNED_HYPER:
+            pRegisterReturn[1] = r1;
+        case typelib_TypeClass_LONG:
+        case typelib_TypeClass_UNSIGNED_LONG:
+        case typelib_TypeClass_ENUM:
+        case typelib_TypeClass_CHAR:
+        case typelib_TypeClass_SHORT:
+        case typelib_TypeClass_UNSIGNED_SHORT:
+        case typelib_TypeClass_BOOLEAN:
+        case typelib_TypeClass_BYTE:
+            pRegisterReturn[0] = r0;
+            break;
+        case typelib_TypeClass_FLOAT:
+#if defined(__ARM_EABI__) || defined(__SOFTFP__)
+            pRegisterReturn[0] = r0;
+#else
+            *(float*)pRegisterReturn = fret;
+#endif
+	    break;
+        case typelib_TypeClass_DOUBLE:
+#if defined(__ARM_EABI__) || defined(__SOFTFP__)
+            pRegisterReturn[1] = r1;
+            pRegisterReturn[0] = r0;
+#else
+            *(double*)pRegisterReturn = dret;
+#endif
+            break;
+        case typelib_TypeClass_STRUCT:
+        case typelib_TypeClass_EXCEPTION:
+        {
+            if (!arm::return_in_hidden_param(pReturnType))
+                pRegisterReturn[0] = r0;
+            break;
+        }
+        default:
+            break;
+    }
+}
+
+namespace
+{
+//================================================================
+
+void callVirtualMethod(
+    void * pThis,
+    sal_Int32 nVtableIndex,
+    void * pRegisterReturn,
+    typelib_TypeDescriptionReference * pReturnType,
+    sal_uInt32 *pStack,
+    sal_uInt32 nStack,
+    sal_uInt32 *pGPR,
+    sal_uInt32 nGPR) __attribute__((noinline));
+
+void callVirtualMethod(
+    void * pThis,
+    sal_Int32 nVtableIndex,
+    void * pRegisterReturn,
+    typelib_TypeDescriptionReference * pReturnType,
+    sal_uInt32 *pStack,
+    sal_uInt32 nStack,
+    sal_uInt32 *pGPR,
+    sal_uInt32 nGPR)
+{
+    // never called
+    if (! pThis)
+        CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
+
+    if ( nStack )
+    {
+        // 8-bytes aligned
+        sal_uInt32 nStackBytes = ( ( nStack + 1 ) >> 1 ) * 8;
+        sal_uInt32 *stack = (sal_uInt32 *) __builtin_alloca( nStackBytes );
+        memcpy( stack, pStack, nStackBytes );
+    }
+
+    // Should not happen, but...
+    if ( nGPR > arm::MAX_GPR_REGS )
+        nGPR = arm::MAX_GPR_REGS;
+
+    sal_uInt32 pMethod = *((sal_uInt32*)pThis);
+    pMethod += 4 * nVtableIndex;
+    pMethod = *((sal_uInt32 *)pMethod);
+
+    typedef void (*FunctionCall )( sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32);
+    FunctionCall pFunc = (FunctionCall)pMethod;
+
+    (*pFunc)(pGPR[0], pGPR[1], pGPR[2], pGPR[3]);
+
+    sal_uInt32 r0;
+    sal_uInt32 r1;
+
+    // get return value
+    __asm__ __volatile__ (
+        "mov %0, r0\n\t"
+        "mov %1, r1\n\t"
+        : "=r" (r0), "=r" (r1) : );
+
+    MapReturn(r0, r1, pReturnType, (sal_uInt32*)pRegisterReturn);
+}
+}
+
+#define INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < arm::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
+
+#ifdef __ARM_EABI__
+#define INSERT_INT64( pSV, nr, pGPR, pDS, pStart, bOverflow ) \
+        if ( (nr < arm::MAX_GPR_REGS) && (nr % 2) ) \
+        { \
+            	++nr; \
+        } \
+        if ( nr < arm::MAX_GPR_REGS ) \
+        { \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
+                pGPR[nr++] = *(reinterpret_cast<sal_uInt32 *>( pSV ) + 1); \
+        } \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+	{ \
+		if ( (pDS - pStart) % 2) \
+                { \
+                	++pDS; \
+                } \
+                *pDS++ = reinterpret_cast<sal_uInt32 *>( pSV )[0]; \
+                *pDS++ = reinterpret_cast<sal_uInt32 *>( pSV )[1]; \
+	}
+#else
+#define INSERT_INT64( pSV, nr, pGPR, pDS, pStart, bOverflow ) \
+        INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow) \
+        INSERT_INT32( ((sal_uInt32*)pSV)+1, nr, pGPR, pDS, bOverflow)
+#endif
+
+#define INSERT_FLOAT( pSV, nr, pFPR, pDS, bOverflow ) \
+        INSERT_INT32( pSV, nr, pGPR, pDS, bOverflow)
+
+#define INSERT_DOUBLE( pSV, nr, pFPR, pDS, pStart, bOverflow ) \
+        INSERT_INT64( pSV, nr, pGPR, pDS, pStart, bOverflow )
+
+#define INSERT_INT16( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < arm::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
+
+#define INSERT_INT8( pSV, nr, pGPR, pDS, bOverflow ) \
+        if ( nr < arm::MAX_GPR_REGS ) \
+                pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
+        else \
+                bOverFlow = true; \
+        if (bOverFlow) \
+                *pDS++ = *reinterpret_cast<sal_uInt8 *>( pSV );
+
+namespace {
+//======================================================================= 
+static void cpp_call(
+    bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+    bridges::cpp_uno::shared::VtableSlot aVtableSlot,
+    typelib_TypeDescriptionReference * pReturnTypeRef,
+    sal_Int32 nParams, typelib_MethodParameter * pParams,
+    void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
+{
+    // max space for: [complex ret ptr], values|ptr ...
+    sal_uInt32 * pStack = (sal_uInt32 *)__builtin_alloca(
+        sizeof(sal_Int32) + ((nParams+2) * sizeof(sal_Int64)) );
+    sal_uInt32 * pStackStart = pStack;
+
+    sal_uInt32 pGPR[arm::MAX_GPR_REGS];
+    sal_uInt32 nGPR = 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
+
+    bool bOverFlow = false;
+    bool bSimpleReturn = true;
+    if (pReturnTypeDescr)
+    {
+        if (arm::return_in_hidden_param( pReturnTypeRef ) )
+            bSimpleReturn = false;
+
+        if (bSimpleReturn)
+            pCppReturn = pUnoReturn; // direct way for simple types
+        else
+        {
+            // complex return via ptr
+            pCppReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+                    ? __builtin_alloca( pReturnTypeDescr->nSize )
+                    : pUnoReturn); // direct way
+
+            INSERT_INT32( &pCppReturn, nGPR, pGPR, pStack, bOverFlow );
+        }
+    }
+    // push this
+    void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI())
+        + aVtableSlot.offset;
+    INSERT_INT32( &pAdjustedThisPtr, nGPR, pGPR, pStack, bOverFlow );
+
+    // stack space
+    OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+    // args
+    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;
+    
+    for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+    {
+        const typelib_MethodParameter & rParam = pParams[nPos];
+        typelib_TypeDescription * pParamTypeDescr = 0;
+        TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+        if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+        {
+//            uno_copyAndConvertData( pCppArgs[nPos] = pStack, pUnoArgs[nPos],
+            uno_copyAndConvertData( pCppArgs[nPos] = alloca(8), pUnoArgs[nPos],
+                pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
+            
+            switch (pParamTypeDescr->eTypeClass)
+            {
+            case typelib_TypeClass_HYPER:
+            case typelib_TypeClass_UNSIGNED_HYPER:
+#ifdef CMC_DEBUG
+			    fprintf(stderr, "hyper is %lx\n", pCppArgs[nPos]);
+#endif
+                INSERT_INT64( pCppArgs[nPos], nGPR, pGPR, pStack, pStackStart, bOverFlow );
+                break;
+            case typelib_TypeClass_LONG:
+            case typelib_TypeClass_UNSIGNED_LONG:
+            case typelib_TypeClass_ENUM:
+#ifdef CMC_DEBUG
+			    fprintf(stderr, "long is %x\n", pCppArgs[nPos]);
+#endif
+                INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                break;
+            case typelib_TypeClass_SHORT:
+            case typelib_TypeClass_CHAR:
+            case typelib_TypeClass_UNSIGNED_SHORT:
+                INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                break;
+            case typelib_TypeClass_BOOLEAN:
+            case typelib_TypeClass_BYTE:
+                INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+                break;
+            case typelib_TypeClass_FLOAT:
+                INSERT_FLOAT( pCppArgs[nPos], nGPR, pGPR, pStack, bOverFlow );
+			    break;
+            case typelib_TypeClass_DOUBLE:
+                INSERT_DOUBLE( pCppArgs[nPos], nGPR, pGPR, pStack, pStackStart, bOverFlow );
+                break;
+            default:
+                break;
+            }
+            // no longer needed
+            TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+        }
+        else // ptr to complex value | ref
+        {
+            if (! rParam.bIn) // is pure out
+            {
+                // cpp out is constructed mem, uno out is not!
+                uno_constructData(
+                    pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                    pParamTypeDescr );
+                pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+                // will be released at reconversion
+                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+            }
+            // is in/inout
+            else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
+            {
+                uno_copyAndConvertData(
+                    pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                    pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
+                
+                pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+                // will be released at reconversion
+                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+            }
+            else // direct way
+            {
+                pCppArgs[nPos] = pUnoArgs[nPos];
+                // no longer needed
+                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+            }
+            INSERT_INT32( &(pCppArgs[nPos]), nGPR, pGPR, pStack, bOverFlow );
+        }
+    }
+
+    try
+    {
+        callVirtualMethod(
+            pAdjustedThisPtr, aVtableSlot.index,
+            pCppReturn, pReturnTypeRef,
+            pStackStart, 
+            (pStack - pStackStart),
+            pGPR, nGPR);
+
+        // NO exception occurred...
+        *ppUnoExc = 0;
+
+        // reconvert temporary params
+        for ( ; nTempIndizes--; )
+        {
+            sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+            typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+            
+            if (pParams[nIndex].bIn)
+            {
+                if (pParams[nIndex].bOut) // inout
+                {
+                    uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value
+                    uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+                                            pThis->getBridge()->getCpp2Uno() );
+                }
+            }
+            else // pure out
+            {
+                uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+                                        pThis->getBridge()->getCpp2Uno() );
+            }
+            // destroy temp cpp param => cpp: every param was constructed
+            uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+            
+            TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+        }
+        // return value
+        if (pCppReturn && pUnoReturn != pCppReturn)
+        {
+            uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr,
+                                    pThis->getBridge()->getCpp2Uno() );
+            uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
+        }
+    }
+    catch (...)
+    {
+//        __asm__ __volatile__ ("sub sp, sp, #2048\n");
+
+        // fill uno exception
+        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+
+        // temporary params
+        for ( ; nTempIndizes--; )
+        {
+            sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+            // destroy temp cpp param => cpp: every param was constructed
+            uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release );
+            TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+        }
+        
+        // return type
+        if (pReturnTypeDescr)
+            TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+    }
+}
+}
+
+namespace bridges { namespace cpp_uno { namespace shared {
+
+void unoInterfaceProxyDispatch(
+    uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
+    void * pReturn, void * pArgs[], uno_Any ** ppException )
+{
+    // 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<typelib_InterfaceAttributeTypeDescription const *>
+              (pMemberDescr)));
+        
+        if (pReturn)
+        {
+            // dependent dispatch
+            cpp_call(
+                pThis, aVtableSlot,
+                ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef,
+                0, 0, // no params
+                pReturn, pArgs, ppException );
+        }
+        else
+        {
+            // is SET
+            typelib_MethodParameter aParam;
+            aParam.pTypeRef =
+                ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef;
+            aParam.bIn      = sal_True;
+            aParam.bOut     = sal_False;
+
+            typelib_TypeDescriptionReference * pReturnTypeRef = 0;
+            OUString aVoidName( RTL_CONSTASCII_USTRINGPARAM("void") );
+            typelib_typedescriptionreference_new(
+                &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
+            
+            // dependent dispatch
+            aVtableSlot.index += 1;
+            cpp_call(
+                pThis, aVtableSlot, // get, then set method
+                pReturnTypeRef,
+                1, &aParam,
+                pReturn, pArgs, ppException );
+            
+            typelib_typedescriptionreference_release( pReturnTypeRef );
+        }
+        
+        break;
+    }
+    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<typelib_InterfaceMethodTypeDescription const *>
+              (pMemberDescr)));
+
+        switch (aVtableSlot.index)
+        {
+            // standard calls
+        case 1: // acquire uno interface
+            (*pUnoI->acquire)( pUnoI );
+            *ppException = 0;
+            break;
+        case 2: // release uno interface
+            (*pUnoI->release)( pUnoI );
+            *ppException = 0;
+            break;
+        case 0: // queryInterface() opt
+        {
+            typelib_TypeDescription * pTD = 0;
+            TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() );
+            if (pTD)
+            {
+                uno_Interface * pInterface = 0;
+                (*pThis->getBridge()->getUnoEnv()->getRegisteredInterface)(
+                    pThis->getBridge()->getUnoEnv(),
+                    (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD );
+            
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( pReturn ),
+                        &pInterface, pTD, 0 );
+                    (*pInterface->release)( pInterface );
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *ppException = 0;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+            }
+        } // else perform queryInterface()
+        default:
+            // dependent dispatch
+            cpp_call(
+                pThis, aVtableSlot,
+                ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef,
+                ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams,
+                ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams,
+                pReturn, pArgs, ppException );
+        }
+        break;
+    }
+    default:
+    {
+        ::com::sun::star::uno::RuntimeException aExc(
+            OUString( RTL_CONSTASCII_USTRINGPARAM("illegal member type description!") ),
+            ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() );
+        
+        Type const & rExcType = ::getCppuType( &aExc );
+        // binary identical null reference
+        ::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 );
+    }
+    }
+}
+
+} } }
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/main/set_soenv.in b/main/set_soenv.in
index 0b19acb..b51f60b 100644
--- a/main/set_soenv.in
+++ b/main/set_soenv.in
@@ -397,6 +397,17 @@ elsif ( $platform =~ m/freebsd/ )
       $JRETOOLKITDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."i386".$ds."client";
       $JRETHREADDIR   = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."i386".$ds."native_threads";
    }
+   elsif ($platform =~ m/^arm.*?l-/)
+   {  print "Setting FreeBSD ARM specific values... ";
+      $outfile        = "FreeBSDARMEnv.Set"; 
+      $CPU            = "R";
+      $CPUNAME        = "ARM";
+      $OUTPATH        = "unxfbsdr";
+      $JRELIBDIR      = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."arm";
+      $JRETOOLKITDIR  = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."arm".$ds."server";
+      $JRETHREADDIR   = '$JAVA_HOME'.$ds."jre".$ds."lib".$ds."arm".$ds."native_threads";
+      $EPM_FLAGS      = "-a arm";
+   }
    elsif ($platform =~ m/^powerpc/)
    {
       if (($platform =~ m/^powerpc64/) && ('@SIZEOF_LONG@' eq '8')) {
diff --git a/main/solenv/inc/unxfbsd.mk b/main/solenv/inc/unxfbsd.mk
index 1955f17..006b815 100644
--- a/main/solenv/inc/unxfbsd.mk
+++ b/main/solenv/inc/unxfbsd.mk
@@ -46,6 +46,9 @@ JAVAFLAGSDEBUG=-g
 .IF "$(CPUNAME)" == "POWERPC64"
 .INCLUDE : unxfbsdppc64.mk
 .ENDIF
+.IF "$(CPUNAME)" == "ARM"
+.INCLUDE : unxfbsdr.mk
+.ENDIF
 
 # filter for supressing verbose messages from linker
 #not needed at the moment
diff --git a/main/solenv/inc/unxfbsdr.mk b/main/solenv/inc/unxfbsdr.mk
new file mode 100644
index 0000000..24cf868
--- /dev/null
+++ b/main/solenv/inc/unxfbsdr.mk
@@ -0,0 +1,46 @@
+#**************************************************************
+#  
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#    http://www.apache.org/licenses/LICENSE-2.0
+#  
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#  
+#**************************************************************
+
+
+
+# mk file for FreeBSD Unix ARM using GCC, please make generic modifications
+# to unxfbsd.mk
+
+CDEFAULTOPT=-Os
+CDEFS+=-DARM32
+CFLAGS+=-fno-omit-frame-pointer
+DLLPOSTFIX=
+
+.IF "$(ARM_TARGET)" == "ARMV4T"
+ARCH_FLAGS+=-march=armv4t
+CDEFS+=-DARMV4T
+.ENDIF
+
+.IF "$(ARM_TARGET)" == "ARMV6"
+ARCH_FLAGS+=-march=armv6
+CDEFS+=-DARMV6
+.ENDIF
+
+.IF "$(ARM_TARGET)" == "ARMV7"
+ARCH_FLAGS+=-march=armv7-a -mtune=cortex-a8 -mfpu=neon
+CDEFS+=-DARMV7
+.ENDIF
+


[openoffice] 07/07: freebsd-powerpc: obvious fix.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit a41e569492f214f161482e71021c40f3f140471f
Author: Pedro Giffuni <pf...@apache.org>
AuthorDate: Sun Oct 1 05:00:24 2017 +0000

    freebsd-powerpc: obvious fix.
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1810250 13f79535-47bb-0310-9956-ffa450edef68
---
 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx
index c43b07b..eafc103 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/uno2cpp.cxx
@@ -24,7 +24,7 @@
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_bridges.hxx"
 
-#include <malloc.h>
+#include <stdlib.h>
 
 #include <com/sun/star/uno/genfunc.hxx>
 #include <uno/data.h>


[openoffice] 05/07: Permit using clang for FreeBSD ARM and PowerPC builds.

Posted by tr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

truckman pushed a commit to branch AOO418
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit 2926eac7ac3a8dfadc9e4263d97f4b9a2666fd37
Author: Pedro Giffuni <pf...@apache.org>
AuthorDate: Tue Feb 7 21:32:10 2017 +0000

    Permit using clang for FreeBSD ARM and PowerPC builds.
    
    Inspired on the linux/clang changes.
    
    
    git-svn-id: https://svn.apache.org/repos/asf/openoffice/trunk@1782082 13f79535-47bb-0310-9956-ffa450edef68
---
 main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk       | 2 +-
 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk   | 2 +-
 main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
index 39df3a4..486736d 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_arm/makefile.mk
@@ -35,7 +35,7 @@ NO_BSYMBOLIC=TRUE
 
 # --- Files --------------------------------------------------------
 
-.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCFREEBSDRgcc3"
+.IF "(OS)$(CPU)$(COMNAME)" == "FREEBSDRgcc3"
 
 .IF "$(cppu_no_leak)" == ""
 CFLAGS += -DLEAK_STATIC_DATA
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk
index 0f05903..398e80d 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc/makefile.mk
@@ -33,7 +33,7 @@ ENABLE_EXCEPTIONS=TRUE
 .INCLUDE :  settings.mk
 
 # --- Files --------------------------------------------------------
-.IF "$(COM)$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "GCCLINUXPgcc3POWERPC"
+.IF "$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "FREEBSDPgcc3POWERPC"
 
 .IF "$(cppu_no_leak)" == ""
 CFLAGS += -DLEAK_STATIC_DATA
diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
index 0676b13..931edd8 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_powerpc64/makefile.mk
@@ -34,7 +34,7 @@ ENABLE_EXCEPTIONS=TRUE
 
 # --- Files --------------------------------------------------------
 
-.IF "$(COM)$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "GCCFREEBSDPgcc3POWERPC64"
+.IF "$(OS)$(CPU)$(COMNAME)$(CPUNAME)" == "FREEBSDPgcc3POWERPC64"
 
 .IF "$(cppu_no_leak)" == ""
 CFLAGS += -DLEAK_STATIC_DATA