[Libreoffice-commits] .: 11 commits - bridges/prj bridges/source cppu/source idlc/source io/source jvmfwk/distributions jvmfwk/source pyuno/zipcore sal/inc sal/osl sal/rtl ure/source xml2cmp/source

Caolán McNamara caolan at kemper.freedesktop.org
Wed Oct 13 12:37:53 PDT 2010


 bridges/prj/build.lst                               |    1 
 bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx |  663 ++++++++++++++++++++
 bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx  |  291 ++++++++
 bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk |   81 ++
 bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx   |  102 +++
 bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx |  502 +++++++++++++++
 cppu/source/typelib/static_types.cxx                |   15 
 cppu/source/typelib/typelib.cxx                     |   17 
 idlc/source/idlccompile.cxx                         |    2 
 io/source/stm/opipe.cxx                             |    6 
 io/source/stm/streamhelper.cxx                      |   16 
 io/source/stm/streamhelper.hxx                      |   28 
 jvmfwk/distributions/OpenOfficeorg/makefile.mk      |    2 
 jvmfwk/source/fwkutil.cxx                           |    4 
 pyuno/zipcore/makefile.mk                           |    6 
 pyuno/zipcore/python.sh                             |    6 
 sal/inc/osl/endian.h                                |   10 
 sal/inc/rtl/uuid.h                                  |    2 
 sal/inc/sal/alloca.h                                |    2 
 sal/inc/sal/config.h                                |    2 
 sal/inc/sal/main.h                                  |    4 
 sal/osl/unx/backtrace.c                             |   11 
 sal/osl/unx/file_error_transl.cxx                   |    2 
 sal/osl/unx/file_volume.cxx                         |   13 
 sal/osl/unx/interlck.c                              |    2 
 sal/osl/unx/makefile.mk                             |    2 
 sal/osl/unx/module.c                                |   66 +
 sal/osl/unx/nlsupport.c                             |    8 
 sal/osl/unx/process.c                               |    2 
 sal/osl/unx/security.c                              |    3 
 sal/osl/unx/socket.c                                |    4 
 sal/osl/unx/system.c                                |    1 
 sal/osl/unx/system.h                                |   19 
 sal/osl/unx/tempfile.c                              |   18 
 sal/rtl/source/alloc.c                              |    4 
 sal/rtl/source/alloc_global.c                       |    2 
 sal/rtl/source/macro.hxx                            |    2 
 sal/rtl/source/makefile.mk                          |    6 
 ure/source/startup.sh                               |   13 
 xml2cmp/source/xcd/filebuff.cxx                     |    4 
 40 files changed, 1865 insertions(+), 79 deletions(-)

New commits:
commit 613f70a6b06494bf5d9f8b23d7337ffa94274eff
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 15:41:46 2010 +0100

    tweaks for AIX

diff --git a/xml2cmp/source/xcd/filebuff.cxx b/xml2cmp/source/xcd/filebuff.cxx
index b39b205..1530fb5 100644
--- a/xml2cmp/source/xcd/filebuff.cxx
+++ b/xml2cmp/source/xcd/filebuff.cxx
@@ -25,6 +25,10 @@
  *
  ************************************************************************/
 
+#ifdef AIX
+#    undef _THREAD_SAFE
+#endif
+
 #include "filebuff.hxx"
 
 #include <string.h>
commit 75e6bac5a7faa098f69988580c187a16d9f7ddb3
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 15:40:45 2010 +0100

    fixes for AIX

diff --git a/ure/source/startup.sh b/ure/source/startup.sh
index 7f973c5..88301c2 100644
--- a/ure/source/startup.sh
+++ b/ure/source/startup.sh
@@ -39,8 +39,17 @@ epath=`dirname "$0"`
 if [ -x "${epath}/javaldx" ] ; then
     jpath=`"${epath}/javaldx" $my_envargs`
     if [ -n "${jpath}" ]; then
-        LD_LIBRARY_PATH=${jpath}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-        export LD_LIBRARY_PATH
+        sd_platform=`uname -s`
+        case $sd_platform in
+          AIX)
+            LIBPAT=${jpath}${LIBPATH:+:${LIBPATH}}
+            export LIBPATH
+            ;;
+          *)
+            LD_LIBRARY_PATH=${jpath}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+            export LD_LIBRARY_PATH
+            ;;
+        esac
     fi
 fi
 
commit 9907c0e112cd8baf3b865e348a4c0eb46ec0d04a
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 15:34:27 2010 +0100

    fix typo

diff --git a/sal/inc/sal/main.h b/sal/inc/sal/main.h
index dd29769..01d14c8 100644
--- a/sal/inc/sal/main.h
+++ b/sal/inc/sal/main.h
@@ -47,7 +47,7 @@ int SAL_CALL main(int argc, char ** argv) \
     sal_detail_initialize(argc, argv);   \
     ret = sal_main_with_args(argc, argv); \
     sal_detail_deinitialize(); \
-    return x; \
+    return ret; \
 }
 
 #define SAL_MAIN_IMPL \
@@ -57,7 +57,7 @@ int SAL_CALL main(int argc, char ** argv) \
     sal_detail_initialize(argc, argv); \
     ret = sal_main(); \
     sal_detail_deinitialize(); \
-    return x; \
+    return ret; \
 }
 
 /* Definition macros for CRT entries */
commit 3d0878b7aa90786eee0a95f68b130a06494d028c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 15:06:44 2010 +0100

    AIX port

diff --git a/sal/inc/osl/endian.h b/sal/inc/osl/endian.h
index e8ed472..fbb8479 100644
--- a/sal/inc/osl/endian.h
+++ b/sal/inc/osl/endian.h
@@ -104,11 +104,15 @@ extern "C" {
 #endif
 
 #ifdef AIX
-#	include <sys/machine.h>
+#   include <sys/machine.h>
 #   if BYTE_ORDER == LITTLE_ENDIAN
-#   	define _LITTLE_ENDIAN
+#       ifndef _LITTLE_ENDIAN
+#   	    define _LITTLE_ENDIAN
+#       endif
 #   elif BYTE_ORDER == BIG_ENDIAN
-#   	define _BIG_ENDIAN
+#   	ifndef _BIG_ENDIAN
+#   	    define _BIG_ENDIAN
+#       endif
 #   elif BYTE_ORDER == PDP_ENDIAN
 #   	define _PDP_ENDIAN
 #   endif
diff --git a/sal/inc/rtl/uuid.h b/sal/inc/rtl/uuid.h
index efc6d83..30018be 100644
--- a/sal/inc/rtl/uuid.h
+++ b/sal/inc/rtl/uuid.h
@@ -198,6 +198,8 @@ void SAL_CALL rtl_createNamedUuid(
 #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
 #elif MACOSX
 #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 100000
+#elif AIX
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
 #else
 #error "System time resolution must be calculated!"
 #endif
diff --git a/sal/inc/sal/alloca.h b/sal/inc/sal/alloca.h
index 8214f92..2879431 100644
--- a/sal/inc/sal/alloca.h
+++ b/sal/inc/sal/alloca.h
@@ -28,7 +28,7 @@
 #ifndef INCLUDED_SAL_ALLOCA_H
 #define INCLUDED_SAL_ALLOCA_H
 
-#if defined (SOLARIS) || defined (LINUX) || defined(__EMX__)
+#if defined (SOLARIS) || defined (LINUX) || defined(__EMX__) || defined(AIX)
 
 #ifndef INCLUDED_ALLOCA_H
 #include <alloca.h>
diff --git a/sal/inc/sal/config.h b/sal/inc/sal/config.h
index ada8cbd..ac600fd 100644
--- a/sal/inc/sal/config.h
+++ b/sal/inc/sal/config.h
@@ -91,7 +91,7 @@
 #define SAL_SYSCONFIGFILE( name ) name ".ini"
 #endif
 
-#if defined(SOLARIS) || defined(LINUX) || defined(NETBSD) || defined(FREEBSD) || defined(SCO)
+#if defined(SOLARIS) || defined(LINUX) || defined(NETBSD) || defined(FREEBSD) || defined(SCO) || defined(AIX)
 #define SAL_UNX
 #define SAL_DLLEXTENSION ".so"
 #define SAL_DLLPREFIX "lib"
diff --git a/sal/inc/sal/main.h b/sal/inc/sal/main.h
index 7f70432..dd29769 100644
--- a/sal/inc/sal/main.h
+++ b/sal/inc/sal/main.h
@@ -29,6 +29,9 @@
 #define _SAL_MAIN_H_
 
 #include <sal/types.h>
+#if defined(AIX)
+#   include <unistd.h>
+#endif
 
 #ifdef __cplusplus
 extern "C" {
@@ -44,7 +47,7 @@ int SAL_CALL main(int argc, char ** argv) \
     sal_detail_initialize(argc, argv);   \
     ret = sal_main_with_args(argc, argv); \
     sal_detail_deinitialize(); \
-    return ret; \
+    return x; \
 }
 
 #define SAL_MAIN_IMPL \
@@ -54,10 +57,9 @@ int SAL_CALL main(int argc, char ** argv) \
     sal_detail_initialize(argc, argv); \
     ret = sal_main(); \
     sal_detail_deinitialize(); \
-    return ret; \
+    return x; \
 }
 
-
 /* Definition macros for CRT entries */
 
 #ifdef SAL_W32
diff --git a/sal/osl/unx/backtrace.c b/sal/osl/unx/backtrace.c
index c779059..b0a9de3 100755
--- a/sal/osl/unx/backtrace.c
+++ b/sal/osl/unx/backtrace.c
@@ -357,3 +357,14 @@ void backtrace_symbols_fd( void **buffer, int size, int fd )
 }
 
 #endif /* defined MACOSX */
+
+#if defined(AIX)
+int backtrace( void **buffer, int max_frames )
+{
+    return 0;
+}
+
+void backtrace_symbols_fd( void **buffer, int size, int fd )
+{
+}
+#endif
diff --git a/sal/osl/unx/file_error_transl.cxx b/sal/osl/unx/file_error_transl.cxx
index 2905794..9131614 100644
--- a/sal/osl/unx/file_error_transl.cxx
+++ b/sal/osl/unx/file_error_transl.cxx
@@ -206,9 +206,11 @@ oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno)
            osl_error = osl_File_E_NOSYS;
             break;
 
+#if !defined(AIX) || !(defined(_ALL_SOURCE) && !defined(_LINUX_SOURCE_COMPAT))
         case ENOTEMPTY:
             osl_error = osl_File_E_NOTEMPTY;
             break;
+#endif
 
         case ELOOP:
             osl_error = osl_File_E_LOOP;
diff --git a/sal/osl/unx/file_volume.cxx b/sal/osl/unx/file_volume.cxx
index 3243eb0..8daacc0 100644
--- a/sal/osl/unx/file_volume.cxx
+++ b/sal/osl/unx/file_volume.cxx
@@ -252,7 +252,7 @@ oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeI
 #else /* no statfs available */
 
 #   define __OSL_STATFS_STRUCT        			 struct dummy {int i;}
-#   define __OSL_STATFS_INIT(a)       			 ((void)0)
+#   define __OSL_STATFS_INIT(a)       			 ((void)a)
 #   define __OSL_STATFS(dir, sfs)     		     (1)
 #   define __OSL_STATFS_ISREMOTE(sfs) 			 (0)
 #	define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a)	 (1)
@@ -540,7 +540,7 @@ oslFileError osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
     return osl_File_E_None;
 }
 
-#ifndef MACOSX
+#if !defined(MACOSX) && !defined(AIX)
 
 /*****************************************
  * osl_newVolumeDeviceHandleImpl
@@ -1116,23 +1116,26 @@ osl_isFloppyMounted (oslVolumeDeviceHandleImpl* pDevice)
  *
  *****************************************************************************/
 
-#if (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+#if (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(AIX))
 static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath)
 {
+    (void)pszPath;
     return NULL;
 }
 #endif /* MACOSX */
 
-#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(AIX))
 static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
 {
+    (void)hFloppy;
     return osl_File_E_BUSY;
 }
 #endif /* MACOSX */
 
-#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(AIX))
 static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
 {
+    (void)hFloppy;
     return osl_File_E_BUSY;
 }
 #endif /* MACOSX */
diff --git a/sal/osl/unx/interlck.c b/sal/osl/unx/interlck.c
index dc1eade..436f6f5 100644
--- a/sal/osl/unx/interlck.c
+++ b/sal/osl/unx/interlck.c
@@ -93,7 +93,7 @@ oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount*
     return --nCount;
 }
 
-#elif defined ( GCC ) && defined ( POWERPC )
+#elif defined ( GCC ) && defined ( POWERPC ) && !defined( AIX )
 
 /*****************************************************************************/
 /* osl_incrementInterlockedCount */
diff --git a/sal/osl/unx/makefile.mk b/sal/osl/unx/makefile.mk
index 1dd47fb..d41a887 100644
--- a/sal/osl/unx/makefile.mk
+++ b/sal/osl/unx/makefile.mk
@@ -118,7 +118,7 @@ OBJFILES=   $(OBJ)$/conditn.obj  \
 SLOFILES += $(SLO)$/osxlocale.obj
 .ENDIF
 
-.IF "$(OS)"=="SOLARIS" || "$(OS)"=="FREEBSD" || "$(OS)"=="NETBSD" || "$(OS)$(CPU)"=="LINUXS" || "$(OS)"=="MACOSX"
+.IF "$(OS)"=="SOLARIS" || "$(OS)"=="FREEBSD" || "$(OS)"=="NETBSD" || "$(OS)$(CPU)"=="LINUXS" || "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
 SLOFILES += $(SLO)$/backtrace.obj
 OBJFILES += $(OBJ)$/backtrace.obj
 .ENDIF
diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c
index ba859ec..3a5533f 100644
--- a/sal/osl/unx/module.c
+++ b/sal/osl/unx/module.c
@@ -38,6 +38,10 @@
 #include <stdio.h>
 #endif
 
+#ifdef AIX
+#include <sys/ldr.h>
+#endif
+
 /* implemented in file.c */
 extern int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
 
@@ -201,6 +205,67 @@ osl_getFunctionSymbol(oslModule module, rtl_uString *puFunctionSymbolName)
 sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl)
 {
     sal_Bool result = sal_False;
+#if defined(AIX)
+    int i;
+    int size = 4 * 1024;
+    char *buf, *filename=NULL;
+    struct ld_info *lp;
+
+    if ((buf = malloc(size)) == NULL)
+        return result;
+
+    while((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM)
+    {
+        size += 4 * 1024;
+        if ((buf = malloc(size)) == NULL)
+            break;
+    }
+
+    lp = (struct ld_info*) buf;
+    while (lp)
+    {
+        unsigned long start = (unsigned long)lp->ldinfo_dataorg;
+        unsigned long end = start + lp->ldinfo_datasize;
+        if (start <= (unsigned long)addr && end > (unsigned long)addr)
+        {
+            filename = lp->ldinfo_filename;
+            break;
+        }
+        if (!lp->ldinfo_next)
+            break;
+        lp = (struct ld_info*) ((char *) lp + lp->ldinfo_next);
+    }
+
+    if (filename)
+    {
+        rtl_uString * workDir = NULL;
+        osl_getProcessWorkingDir(&workDir);
+        if (workDir)
+        {
+#if OSL_DEBUG_LEVEL > 1
+            OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", filaname);
+#endif
+            rtl_string2UString(ppLibraryUrl,
+                               filename,
+                               strlen(filename),
+                               osl_getThreadTextEncoding(),
+                               OSTRING_TO_OUSTRING_CVTFLAGS);
+
+            OSL_ASSERT(*ppLibraryUrl != NULL);
+            osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl);
+            osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl);
+
+            rtl_uString_release(workDir);
+            result = sal_True;
+        }
+        else
+        {
+            result = sal_False;
+        }
+    }
+
+    free(buf);
+#else
     Dl_info dl_info;
 
     if ((result = dladdr(addr, &dl_info)) != 0)
@@ -230,6 +295,7 @@ sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibr
             result = sal_False;
         }
     }
+#endif
     return result;
 }
 
diff --git a/sal/osl/unx/nlsupport.c b/sal/osl/unx/nlsupport.c
index 9fe944b..b1bab72 100644
--- a/sal/osl/unx/nlsupport.c
+++ b/sal/osl/unx/nlsupport.c
@@ -924,7 +924,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
     {
         /* only change env vars that exist already */
         if( getenv( "LC_ALL" ) ) {
-#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined ( AIX )
             setenv( "LC_ALL", locale_buf, 1);
 #else
             setenv( "LC_ALL", locale_buf );
@@ -932,7 +932,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
         }
 
         if( getenv( "LC_CTYPE" ) ) {
-#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined ( AIX )
             setenv("LC_CTYPE", locale_buf, 1 );
 #else
             setenv( "LC_CTYPE", locale_buf );
@@ -940,7 +940,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
         }
 
         if( getenv( "LANG" ) ) {
-#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined (AIX )
             setenv("LC_CTYPE", locale_buf, 1 );
 #else
             setenv( "LANG", locale_buf );
@@ -951,6 +951,6 @@ int _imp_setProcessLocale( rtl_Locale * pLocale )
     return 0;
 }
 
-#endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */
+#endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD || AIX */
 
 
diff --git a/sal/osl/unx/process.c b/sal/osl/unx/process.c
index e756256..02f0208 100644
--- a/sal/osl/unx/process.c
+++ b/sal/osl/unx/process.c
@@ -70,7 +70,7 @@
 #define MAX_ARGS        255
 #define MAX_ENVS        255
 
-#if defined(MACOSX) || defined(IORESOURCE_TRANSFER_BSD)
+#if defined(MACOSX) || defined(IORESOURCE_TRANSFER_BSD) || defined(AIX)
 #define CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int))
 #endif
 
diff --git a/sal/osl/unx/security.c b/sal/osl/unx/security.c
index 4dcef03..92bc432 100644
--- a/sal/osl/unx/security.c
+++ b/sal/osl/unx/security.c
@@ -504,6 +504,9 @@ osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd,
 {
 #if defined NETBSD || defined SCO || defined AIX || defined FREEBSD || \
     defined MACOSX
+    (void)pszUserName;
+    (void)pszPasswd;
+    (void)pSecurity;
 
     return osl_Security_E_None;
 
diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c
index 7f7a2b2..847f3dc 100644
--- a/sal/osl/unx/socket.c
+++ b/sal/osl/unx/socket.c
@@ -802,6 +802,10 @@ static struct hostent* _osl_gethostbyname_r (
     __error = gethostbyname_r (name, result, buffer, buflen,
                  &__result, h_errnop);
     return __error ? NULL : __result ;
+#elif defined(AIX)
+    *h_errnop = gethostbyname_r (name, result, (struct hostent_data *)buffer);
+    (void)buflen;
+    return *h_errnop ? NULL : result ;
 #else
     return gethostbyname_r( name, result, buffer, buflen, h_errnop);
 #endif
diff --git a/sal/osl/unx/system.c b/sal/osl/unx/system.c
index f70e839..7d17f02 100644
--- a/sal/osl/unx/system.c
+++ b/sal/osl/unx/system.c
@@ -485,6 +485,7 @@ pid_t getpid(void)
 #ifdef NO_PTHREAD_SEMAPHORES
 int sem_init(sem_t* sem, int pshared, unsigned int value)
 {
+    (void)pshared;
     pthread_mutex_init(&sem->mutex, PTHREAD_MUTEXATTR_DEFAULT);
     pthread_cond_init(&sem->increased, PTHREAD_CONDATTR_DEFAULT);
 
diff --git a/sal/osl/unx/system.h b/sal/osl/unx/system.h
index c7dec21..c86ed96 100644
--- a/sal/osl/unx/system.h
+++ b/sal/osl/unx/system.h
@@ -110,9 +110,13 @@
 #   include <dlfcn.h>
 #	include <endian.h>
 #	if __BYTE_ORDER == __LITTLE_ENDIAN
-#		define _LITTLE_ENDIAN
+#       ifndef _LITTLE_ENDIAN
+#		    define _LITTLE_ENDIAN
+#       endif
 #	elif __BYTE_ORDER == __BIG_ENDIAN
-#		define _BIG_ENDIAN
+#       ifndef _BIG_ENDIAN
+#		    define _BIG_ENDIAN
+#       endif
 #	elif __BYTE_ORDER == __PDP_ENDIAN
 #		define _PDP_ENDIAN
 #	endif
@@ -230,22 +234,25 @@ extern unsigned int nanosleep(unsigned int);
 #   define AF_IPX -1
 #	include <strings.h>
 #	include <pthread.h>
+#	include <dlfcn.h>
 #	include <sys/time.h>
 #	include <sys/un.h>
 #	include <netinet/tcp.h>
 #	include <sys/machine.h>
 #   if BYTE_ORDER == LITTLE_ENDIAN
-#   	define _LITTLE_ENDIAN
+#   	ifndef _LITTLE_ENDIAN
+#   	    define _LITTLE_ENDIAN
+#   	endif
 #   elif BYTE_ORDER == BIG_ENDIAN
-#   	define _BIG_ENDIAN
+#   	ifndef _BIG_ENDIAN
+#   	    define _BIG_ENDIAN
+#   	endif
 #   elif BYTE_ORDER == PDP_ENDIAN
 #   	define _PDP_ENDIAN
 #   endif
-#	define  sched_yield() 				pthread_yield()
 #	define  SLEEP_TIMESPEC(timespec)  	nsleep(&timespec, 0)
 #	define  LIBPATH "LIBPATH"
 #	define  NO_PTHREAD_SEMAPHORES
-#   define  NO_DL_FUNCTIONS
 #endif
 
 #ifdef HPUX
diff --git a/sal/osl/unx/tempfile.c b/sal/osl/unx/tempfile.c
index 7973033..1c3ec8f 100644
--- a/sal/osl/unx/tempfile.c
+++ b/sal/osl/unx/tempfile.c
@@ -66,16 +66,18 @@ oslFileError SAL_CALL osl_getTempDirURL( rtl_uString** pustrTempDir )
     const char *pValue = getenv( "TEMP" );
 
     if ( !pValue )
-    {
         pValue = getenv( "TMP" );
-#if defined(SOLARIS) || defined (LINUX) || defined (FREEBSD)
-        if ( !pValue )
-            pValue = P_tmpdir;
-#elif defined(NETBSD)
-        if ( !pValue )
-            pValue = _PATH_TMP;
+
+#if defined(NETBSD)
+    if ( !pValue )
+        pValue = _PATH_TMP;
+#else
+    if ( !pValue )
+        pValue = P_tmpdir;
 #endif
-    }
+
+    if ( !pValue )
+        pValue = "/tmp";
 #endif /* MACOSX */
 
     if ( pValue )
diff --git a/sal/rtl/source/alloc.c b/sal/rtl/source/alloc.c
index 5fdbec5..87c1b75 100644
--- a/sal/rtl/source/alloc.c
+++ b/sal/rtl/source/alloc.c
@@ -75,7 +75,7 @@ static sal_Size __rtl_memory_vmpagesize (void)
     /* xBSD */
     return (sal_Size)(getpagesize());
 }
-#elif defined(LINUX) || defined(SOLARIS)
+#elif defined(LINUX) || defined(SOLARIS) || defined(AIX)
 static sal_Size __rtl_memory_vmpagesize (void)
 {
     /* POSIX */
@@ -87,7 +87,7 @@ static sal_Size __rtl_memory_vmpagesize (void)
     /* other */
     return (sal_Size)(0x2000);
 }
-#endif /* FREEBSD || NETBSD || MACOSX || LINUX || SOLARIS */
+#endif /* FREEBSD || NETBSD || MACOSX || LINUX || SOLARIS || AIX */
 
 #ifndef PROT_HEAP
 #define PROT_HEAP (PROT_READ | PROT_WRITE | PROT_EXEC)
diff --git a/sal/rtl/source/alloc_global.c b/sal/rtl/source/alloc_global.c
index e3ba392..b7612bc 100644
--- a/sal/rtl/source/alloc_global.c
+++ b/sal/rtl/source/alloc_global.c
@@ -157,7 +157,7 @@ rtl_memory_init (void)
   Delegated the call to "rtl_memory_fini" into a dummy C++ object,
   see memory_fini.cxx .
 */
-#if defined(__GNUC__) && !defined(MACOSX)
+#if defined(__GNUC__) && !defined(MACOSX) && !defined(AIX)
 static void rtl_memory_fini (void) __attribute__((destructor));
 #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
 #pragma fini(rtl_memory_fini)
diff --git a/sal/rtl/source/macro.hxx b/sal/rtl/source/macro.hxx
index 6899a2f..3374e97 100644
--- a/sal/rtl/source/macro.hxx
+++ b/sal/rtl/source/macro.hxx
@@ -50,6 +50,8 @@
 #define THIS_OS "NetBSD"
 #elif defined FREEBSD
 #define THIS_OS "FreeBSD"
+#elif defined AIX
+#define THIS_OS "AIX"
 #endif
 
 #if ! defined THIS_OS
diff --git a/sal/rtl/source/makefile.mk b/sal/rtl/source/makefile.mk
index 517d2c2..b8f4017 100644
--- a/sal/rtl/source/makefile.mk
+++ b/sal/rtl/source/makefile.mk
@@ -61,7 +61,9 @@ UWINAPILIB:=
 
 .IF "$(header)" == ""
 
+.IF "$(OS)" != "AIX"
 ALWAYSDBGFILES=$(SLO)$/debugprint.obj
+.ENDIF
 
 .IF "$(ALWAYSDBGFILES)" != ""
 ALWAYSDBGTARGET=do_it_alwaysdebug
@@ -95,7 +97,7 @@ SLOFILES=   \
             $(SLO)$/alloc_cache.obj \
             $(SLO)$/alloc_arena.obj
 
-.IF "$(OS)"=="MACOSX"
+.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
 SLOFILES+=$(SLO)$/memory_fini.obj
 .ENDIF
 
@@ -128,7 +130,7 @@ OBJFILES=   \
             $(OBJ)$/alloc_cache.obj \
             $(OBJ)$/alloc_arena.obj
 
-.IF "$(OS)"=="MACOSX"
+.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
 OBJFILES+=$(OBJ)$/memory_fini.obj
 .ENDIF
 
commit c018a95eef7a978a9e0d5e403c2e10a02d89e4c9
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 14:46:52 2010 +0100

    tweak this for AIX

diff --git a/pyuno/zipcore/makefile.mk b/pyuno/zipcore/makefile.mk
index 06241da..bad3058 100755
--- a/pyuno/zipcore/makefile.mk
+++ b/pyuno/zipcore/makefile.mk
@@ -81,7 +81,7 @@ ALLTAR : $(BIN)$/python.sh
 $(BIN)$/python.sh : python.sh
     -rm -f $@
     cat $? > $@
-    sed 's/%%PYVERSION%%/$(PYVERSION)/g' < $@ > $@.new
+    sed 's/%%PYVERSION%%/$(PYVERSION)/g' < $@ | sed 's/%%OOO_LIBRARY_PATH_VAR%%/$(OOO_LIBRARY_PATH_VAR)/g'  > $@.new
     mv $@.new $@
     chmod +x $@
 .ENDIF
@@ -93,7 +93,7 @@ $(OUT)$/inc$/pyversion.hxx: pyversion.inc
 
 $(BIN)$/$(PYDIRNAME).zip : $(FILES)
 .IF "$(GUI)" == "UNX"
-.IF "$(OS)" != "MACOSX"
+.IF "$(OS)" != "MACOSX" && "$(OS)" != "AIX"
     cd $(DESTROOT) && find . -name '*$(DLLPOST)' | xargs strip
 .ENDIF
 .ENDIF
@@ -110,7 +110,7 @@ $(BIN)$/python$(EXECPOST).bin : $(SOLARBINDIR)$/python$(EXECPOST)
     -$(MKDIRHIER) $(@:d)
     -rm -f $@
     cat $< > $@
-.IF "$(OS)" != "MACOSX"
+.IF "$(OS)" != "MACOSX" && "$(OS)" != "AIX"
     strip $@
 .ENDIF
     chmod +x $@
diff --git a/pyuno/zipcore/python.sh b/pyuno/zipcore/python.sh
index b53e369..219e737 100644
--- a/pyuno/zipcore/python.sh
+++ b/pyuno/zipcore/python.sh
@@ -43,9 +43,9 @@ cd "$sd_cwd"
 PATH=$sd_prog${PATH+:$PATH}
 export PATH
 
-# Set LD_LIBRARY_PATH so that "import pyuno" finds libpyuno.so:
-LD_LIBRARY_PATH=$sd_prog/../basis-link/program:$sd_prog/../basis-link/ure-link/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
-export LD_LIBRARY_PATH
+# Set %%OOO_LIBRARY_PATH_VAR%% so that "import pyuno" finds libpyuno.so:
+%%OOO_LIBRARY_PATH_VAR%%=$sd_prog/../basis-link/program:$sd_prog/../basis-link/ure-link/lib${%%OOO_LIBRARY_PATH_VAR%%:+:$%%OOO_LIBRARY_PATH_VAR%%}
+export %%OOO_LIBRARY_PATH_VAR%%
 
 # Set UNO_PATH so that "officehelper.bootstrap()" can find soffice executable:
 : ${UNO_PATH=$sd_prog}
commit 4d91f9c645d1da1a52d699d33e47259873ce6202
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 13:39:57 2010 +0100

    rename IFIFO due to AIX conflict

diff --git a/io/source/stm/opipe.cxx b/io/source/stm/opipe.cxx
index f87d98c..1e82b01 100644
--- a/io/source/stm/opipe.cxx
+++ b/io/source/stm/opipe.cxx
@@ -134,7 +134,7 @@ private:
 
     oslCondition m_conditionBytesAvail;
     Mutex     m_mutexAccess;
-    IFIFO		*m_pFIFO;
+    I_FIFO		*m_pFIFO;
 };
 
 
@@ -346,13 +346,13 @@ void OPipeImpl::writeBytes(const Sequence< sal_Int8 >& aData)
         }
         m_nBytesToSkip = 0;
     }
-    catch ( IFIFO_OutOfBoundsException & )
+    catch ( I_FIFO_OutOfBoundsException & )
     {
         throw BufferSizeExceededException(
             OUString( RTL_CONSTASCII_USTRINGPARAM( "Pipe::writeBytes BufferSizeExceededException" )),
             *this );
     }
-    catch ( IFIFO_OutOfMemoryException & )
+    catch ( I_FIFO_OutOfMemoryException & )
     {
         throw BufferSizeExceededException(
             OUString( RTL_CONSTASCII_USTRINGPARAM( "Pipe::writeBytes BufferSizeExceededException" )),
commit aba4270b310fb32cc96e2094c6b72794890e1260
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 13:29:21 2010 +0100

    tweaks for AIX

diff --git a/jvmfwk/distributions/OpenOfficeorg/makefile.mk b/jvmfwk/distributions/OpenOfficeorg/makefile.mk
index a6ba7a2..36e8e8d 100755
--- a/jvmfwk/distributions/OpenOfficeorg/makefile.mk
+++ b/jvmfwk/distributions/OpenOfficeorg/makefile.mk
@@ -43,7 +43,7 @@ $(BIN)$/javavendors.xml: javavendors_unx.xml javavendors_wnt.xml javavendors_mac
     -$(COPY) javavendors_freebsd.xml $(BIN)$/javavendors.xml
 .ELIF "$(OS)"=="MACOSX"
     -$(COPY) javavendors_macosx.xml $(BIN)$/javavendors.xml
-.ELIF "$(OS)"=="LINUX"
+.ELIF "$(OS)"=="LINUX" || "$(OS)"=="AIX"
     -$(COPY) javavendors_linux.xml $(BIN)$/javavendors.xml
 .ELSE
     -$(COPY) javavendors_unx.xml $(BIN)$/javavendors.xml
diff --git a/jvmfwk/source/fwkutil.cxx b/jvmfwk/source/fwkutil.cxx
index a50ed09..51a0d26 100644
--- a/jvmfwk/source/fwkutil.cxx
+++ b/jvmfwk/source/fwkutil.cxx
@@ -270,8 +270,10 @@ rtl::OUString findPlugin(
         {
             rtl::OUString url;
 #ifdef UNX
-#ifdef MACOSX
+#if defined(MACOSX)
             rtl::OUString path = rtl::OUString::createFromAscii("DYLD_LIBRARY_PATH");
+#elif defined(AIX)
+            rtl::OUString path = rtl::OUString::createFromAscii("LIBPATH");
 #else
             rtl::OUString path = rtl::OUString::createFromAscii("LD_LIBRARY_PATH");
 #endif
commit da307f47614d485aa241a9d7fa13d06aa248aeac
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 13:28:46 2010 +0100

    rename IFIFO due to AIX conflict

diff --git a/io/source/stm/streamhelper.cxx b/io/source/stm/streamhelper.cxx
index acd687d..143dd1d 100644
--- a/io/source/stm/streamhelper.cxx
+++ b/io/source/stm/streamhelper.cxx
@@ -43,8 +43,8 @@ using namespace ::com::sun::star::uno;
 namespace io_stm {
 
 void MemFIFO::write( const Sequence< sal_Int8 > &seq )
-    throw ( IFIFO_OutOfMemoryException,
-            IFIFO_OutOfBoundsException )
+    throw ( I_FIFO_OutOfMemoryException,
+            I_FIFO_OutOfBoundsException )
 {
     try
     {
@@ -52,15 +52,15 @@ void MemFIFO::write( const Sequence< sal_Int8 > &seq )
     }
     catch( IRingBuffer_OutOfMemoryException & )
     {
-        throw IFIFO_OutOfMemoryException();
+        throw I_FIFO_OutOfMemoryException();
     }
     catch( IRingBuffer_OutOfBoundsException & )
     {
-        throw IFIFO_OutOfBoundsException();
+        throw I_FIFO_OutOfBoundsException();
     }
 }
 
-void MemFIFO::read( Sequence<sal_Int8> &seq , sal_Int32 nBufferLen ) throw (IFIFO_OutOfBoundsException)
+void MemFIFO::read( Sequence<sal_Int8> &seq , sal_Int32 nBufferLen ) throw (I_FIFO_OutOfBoundsException)
 {
     try
     {
@@ -69,11 +69,11 @@ void MemFIFO::read( Sequence<sal_Int8> &seq , sal_Int32 nBufferLen ) throw (IFIF
     }
     catch ( IRingBuffer_OutOfBoundsException & )
     {
-        throw IFIFO_OutOfBoundsException();
+        throw I_FIFO_OutOfBoundsException();
     }
 }
 
-void MemFIFO::skip( sal_Int32 nBytesToSkip ) throw ( IFIFO_OutOfBoundsException )
+void MemFIFO::skip( sal_Int32 nBytesToSkip ) throw ( I_FIFO_OutOfBoundsException )
 {
     try
     {
@@ -81,7 +81,7 @@ void MemFIFO::skip( sal_Int32 nBytesToSkip ) throw ( IFIFO_OutOfBoundsException
     }
     catch( IRingBuffer_OutOfBoundsException & )
     {
-        throw IFIFO_OutOfBoundsException();
+        throw I_FIFO_OutOfBoundsException();
     }
 }
 
diff --git a/io/source/stm/streamhelper.hxx b/io/source/stm/streamhelper.hxx
index 6257698..32a1509 100644
--- a/io/source/stm/streamhelper.hxx
+++ b/io/source/stm/streamhelper.hxx
@@ -41,30 +41,30 @@
 
 namespace io_stm {
 
-class IFIFO_OutOfBoundsException :
+class I_FIFO_OutOfBoundsException :
                 public Exception
 {};
 
-class IFIFO_OutOfMemoryException :
+class I_FIFO_OutOfMemoryException :
                 public Exception
 {};
 
-class IFIFO
+class I_FIFO
 {
 public:
 
 
-    virtual void 	write( const Sequence<sal_Int8> &) throw( IFIFO_OutOfMemoryException,
-                                                              IFIFO_OutOfBoundsException )=0;
+    virtual void 	write( const Sequence<sal_Int8> &) throw( I_FIFO_OutOfMemoryException,
+                                                              I_FIFO_OutOfBoundsException )=0;
 
     virtual void 	read( Sequence<sal_Int8> & , sal_Int32 nBytesToRead )
-                                                    throw( IFIFO_OutOfBoundsException )=0;
+                                                       throw( I_FIFO_OutOfBoundsException )=0;
     virtual void 	skip( sal_Int32 nBytesToSkip )
-                                        throw( IFIFO_OutOfBoundsException )=0;
+                                                       throw( I_FIFO_OutOfBoundsException )=0;
     virtual sal_Int32 	getSize() const throw(  )  =0;
     virtual void 	shrink() throw() = 0;
 
-    virtual ~IFIFO() {};
+    virtual ~I_FIFO() {};
 };
 
 
@@ -136,15 +136,15 @@ private:
 
 
 class MemFIFO :
-        public  IFIFO,
-        private MemRingBuffer
+    public  I_FIFO,
+    private MemRingBuffer
 {
 public:
-    virtual void 	write( const Sequence<sal_Int8> &) throw( IFIFO_OutOfMemoryException,
-                                                              IFIFO_OutOfBoundsException );
+    virtual void 	write( const Sequence<sal_Int8> &) throw( I_FIFO_OutOfMemoryException,
+                                                              I_FIFO_OutOfBoundsException );
     virtual void 	read( Sequence<sal_Int8> & , sal_Int32 nBytesToRead )
-                                                    throw( IFIFO_OutOfBoundsException );
-    virtual void 	skip( sal_Int32 nBytesToSkip ) throw( IFIFO_OutOfBoundsException );
+                                                       throw( I_FIFO_OutOfBoundsException );
+    virtual void 	skip( sal_Int32 nBytesToSkip ) throw( I_FIFO_OutOfBoundsException );
     virtual sal_Int32 	getSize()  const throw(  )
                         { return MemRingBuffer::getSize(); }
     virtual void 	shrink() throw()
commit 4787e5b770f08693c4c065c3b37338a1b56f3120
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 13:24:28 2010 +0100

    fix for AIX

diff --git a/idlc/source/idlccompile.cxx b/idlc/source/idlccompile.cxx
index 18af1fa..d9b251a 100644
--- a/idlc/source/idlccompile.cxx
+++ b/idlc/source/idlccompile.cxx
@@ -41,7 +41,7 @@
 
 #ifdef	SAL_UNX
 #include <unistd.h>
-#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD)
+#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD) || defined(AIX)
 #include <sys/wait.h>
 #else
 #include <wait.h>
commit 8ffcc7eb4621de311ce38aa0317f5e674b526bfb
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 13:11:08 2010 +0100

    AIX cppu quirks

diff --git a/cppu/source/typelib/static_types.cxx b/cppu/source/typelib/static_types.cxx
index a952643..185f757 100644
--- a/cppu/source/typelib/static_types.cxx
+++ b/cppu/source/typelib/static_types.cxx
@@ -79,8 +79,15 @@ void SAL_CALL typelib_typedescriptionreference_getByName(
  */
 struct AlignSize_Impl
 {
-    sal_Int16	nInt16;
-    double		dDouble;
+    sal_Int16 nInt16;
+#ifdef AIX
+    //double: doubleword aligned if -qalign=natural/-malign=natural
+    //which isn't the default ABI. Otherwise word aligned, While a long long int
+    //is always doubleword aligned, so use that instead.
+    sal_Int64   dDouble;
+#else
+    double dDouble;
+#endif
 };
 
 #ifdef SAL_W32
@@ -253,7 +260,7 @@ typelib_TypeDescriptionReference ** SAL_CALL typelib_static_type_getByTypeClass(
                     ::typelib_typedescription_register( &pTD1 );
                     ::typelib_typedescription_release( pTD1 );
                     }
-                    // XInterface members	
+                    // XInterface members
                     typelib_InterfaceMethodTypeDescription * pMethod = 0;
                     typelib_Parameter_Init aParameters[1];
                     OUString sParamName0( RTL_CONSTASCII_USTRINGPARAM("aType") );
@@ -492,7 +499,7 @@ void SAL_CALL typelib_static_mi_interface_type_init(
             OUString aTypeName( OUString::createFromAscii( pTypeName ) );
             *ppRef = igetTypeByName( aTypeName.pData );
             if (!*ppRef)
-            {			
+            {
                 typelib_InterfaceTypeDescription * pIface = 0;
                 ::typelib_typedescription_newEmpty(
                     (typelib_TypeDescription **)&pIface, typelib_TypeClass_INTERFACE, aTypeName.pData );
diff --git a/cppu/source/typelib/typelib.cxx b/cppu/source/typelib/typelib.cxx
index 1745dd6..ae68792 100644
--- a/cppu/source/typelib/typelib.cxx
+++ b/cppu/source/typelib/typelib.cxx
@@ -69,8 +69,15 @@ using namespace osl;
  */
 struct AlignSize_Impl
 {
-    sal_Int16	nInt16;
-    double		dDouble;
+    sal_Int16 nInt16;
+#ifdef AIX
+    //double: doubleword aligned if -qalign=natural/-malign=natural
+    //which isn't the default ABI. Otherwise word aligned, While a long long int
+    //is always doubleword aligned, so use that instead.
+    sal_Int64 dDouble;
+#else
+    double dDouble;
+#endif
 };
 
 #ifdef SAL_W32
@@ -1941,7 +1948,13 @@ extern "C" sal_Int32 SAL_CALL typelib_typedescription_getAlignedUnoSize(
                 nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( float ));
                 break;
             case typelib_TypeClass_DOUBLE:
+#ifdef AIX
+                //See previous AIX ifdef comment for an explanation
+                nSize = (sal_Int32)(sizeof(double));
+                rMaxIntegralTypeSize = (sal_Int32)(sizeof(void*));
+#else
                 nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( double ));
+#endif
                 break;
             case typelib_TypeClass_BYTE:
                 nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Int8 ));
commit 3b4365e86483b8447a95491cbdf71957cba68457
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Oct 13 13:07:43 2010 +0100

    add AIX uno bridge

diff --git a/bridges/prj/build.lst b/bridges/prj/build.lst
index d771566..51c342a 100644
--- a/bridges/prj/build.lst
+++ b/bridges/prj/build.lst
@@ -13,6 +13,7 @@ br	bridges\source\cpp_uno\gcc3_freebsd_intel	nmake	-	u	br_gcc3fi br_cppuno_share
 br	bridges\source\cpp_uno\gcc3_linux_x86-64	nmake	-	u	br_gcc3lx br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_freebsd_x86-64	nmake	-	u	br_gcc3fx br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_linux_powerpc	nmake	-	u	br_gcc3lp br_cppuno_shared br_unotypes br_inc NULL
+br	bridges\source\cpp_uno\gcc3_aix_powerpc	nmake	-	u	br_gcc3ap br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_linux_powerpc64	nmake	-	u	br_gcc3lp_64 br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_linux_mips		nmake	-	u	br_gcc3lmips br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_linux_m68k		nmake	-	u	br_gcc3lm68k br_cppuno_shared br_unotypes br_inc NULL
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx
new file mode 100644
index 0000000..e77c732
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx
@@ -0,0 +1,663 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: cpp2uno.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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 <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, double * fpreg, void ** ovrflw,
+        sal_uInt64 * pRegisterReturn /* space for register return */ )
+{
+        // gpreg:  [ret *], this, [gpr params]
+        // fpreg:  [fpr params]
+        // ovrflw: [remainder of params]
+
+        // 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
+
+        sal_Int32 ng = 0;
+        sal_Int32 nf = 0;
+
+    ovrflw -= ppc::MAX_GPR_REGS;
+
+        if (pReturnTypeDescr)
+        {
+                if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+                        pUnoReturn = pRegisterReturn; // direct way for simple types
+                else // complex return via ptr (pCppReturn)
+                {
+                        pCppReturn = *gpreg;
+                        ++gpreg;
+                        ++ng;
+                        ++ovrflw;
+
+                        pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )
+                                                  ? __builtin_alloca( pReturnTypeDescr->nSize )
+                                                  : pCppReturn); // direct way
+                }
+        }
+        // pop this
+        ++gpreg;
+        ++ng;
+        ++ovrflw;
+
+        // stack space
+        OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+        // parameters
+        void ** pUnoArgs = (void **)__builtin_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_BOOLEAN:
+                        case typelib_TypeClass_BYTE:
+                                if (ng < ppc::MAX_GPR_REGS)
+                                {
+                                    *ovrflw = *gpreg++;
+                                    ++ng;
+                }
+                pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-1));
+                ++ovrflw;
+                                break;
+                        case typelib_TypeClass_CHAR:
+                        case typelib_TypeClass_SHORT:
+                        case typelib_TypeClass_UNSIGNED_SHORT:
+                                if (ng < ppc::MAX_GPR_REGS)
+                                {
+                                    *ovrflw = *gpreg++;
+                                    ++ng;
+                                }
+                                pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-2));
+                                ++ovrflw;
+                                break;
+                        case typelib_TypeClass_HYPER:
+                        case typelib_TypeClass_UNSIGNED_HYPER:
+                                pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+                            for (int i = 0; i < 2; ++i)
+                            {
+                                if (ng < ppc::MAX_GPR_REGS)
+                                {
+                                        *ovrflw = *gpreg++;
+                                        ++ng;
+                                }
+                                    ++ovrflw;
+                            }
+                            break;
+                        case typelib_TypeClass_DOUBLE:
+                                if (nf < ppc::MAX_SSE_REGS)
+                                {
+                                    pCppArgs[nPos] = pUnoArgs[nPos] = fpreg;
+                                    ++fpreg;
+                                    ++nf;
+                                }
+                                else
+                                {
+                                    pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+                                }
+                                if (ng < ppc::MAX_GPR_REGS)
+                                {
+                                    ng+=2;
+                                    gpreg+=2;
+                                }
+                                ovrflw+=2;
+                                break;
+                        case typelib_TypeClass_FLOAT:
+                            if (nf < ppc::MAX_SSE_REGS)
+                            {
+                                    pCppArgs[nPos] = pUnoArgs[nPos] = fpreg;
+                                    ++fpreg;
+                                    ++nf;
+                            }
+                            else
+                            {
+                                pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+                            }
+                                if (ng < ppc::MAX_GPR_REGS)
+                                {
+                                    ++gpreg;
+                                    ++ng;
+                                }
+                ++ovrflw;
+                            break;
+                        default:
+                                if (ng < ppc::MAX_GPR_REGS)
+                                {
+                                    *ovrflw = *gpreg++;
+                                    ++ng;
+                                }
+                                pCppArgs[nPos] = pUnoArgs[nPos] = ovrflw;
+                                ++ovrflw;
+                            break;
+                        }
+
+                        // no longer needed
+                        TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+                }
+                else // ptr to complex value | ref
+                {
+                        void *pCppStack; //temporary stack pointer
+
+                        if (ng < ppc::MAX_GPR_REGS)
+                        {
+                            *ovrflw = *gpreg++;
+                            ++ng;
+                        }
+                    pCppArgs[nPos] = pCppStack = *ovrflw++;
+
+                        if (! rParam.bIn) // is pure out
+                        {
+                                // uno out is unconstructed mem!
+                                pUnoArgs[nPos] = __builtin_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] = __builtin_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 );
+                        }
+                }
+        }
+
+        // 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 occured...
+        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 occured...
+        {
+                // 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, double * fpreg, void ** ovrflw,
+        sal_uInt64 * 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 (in space allocated for all params properly aligned)]
+
+        void * pThis;
+        if( nFunctionIndex & 0x8000 )
+        {
+                nFunctionIndex &= 0x7fff;
+                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 sal_uInt64 cpp_vtable_call(sal_Int32 r3, sal_Int32 r4, sal_Int32 r5,
+    sal_Int32 r6, sal_Int32 r7, sal_Int32 r8, sal_Int32 r9,
+    sal_Int32 r10, sal_Int32 firstonstack)
+{
+    volatile unsigned long nOffsetAndIndex;
+
+    __asm__ __volatile__(
+      "mr %0, 11\n\t"
+      : "=r" (nOffsetAndIndex) : );
+
+    sal_Int32 nVtableOffset = (nOffsetAndIndex >> 16);
+    sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFF);
+
+    void ** ovrflw = (void**)&firstonstack;
+
+    sal_Int32 gpreg[ppc::MAX_GPR_REGS];
+    gpreg[0] = r3;
+    gpreg[1] = r4;
+    gpreg[2] = r5;
+    gpreg[3] = r6;
+    gpreg[4] = r7;
+    gpreg[5] = r8;
+    gpreg[6] = r9;
+    gpreg[7] = r10;
+
+    double fpreg[ppc::MAX_SSE_REGS];
+    register double d0 asm("fr1"); fpreg[0] = d0;
+    register double d1 asm("fr2"); fpreg[1] = d1;
+    register double d2 asm("fr3"); fpreg[2] = d2;
+    register double d3 asm("fr4"); fpreg[3] = d3;
+    register double d4 asm("fr5"); fpreg[4] = d4;
+    register double d5 asm("fr6"); fpreg[5] = d5;
+    register double d6 asm("fr7"); fpreg[6] = d6;
+    register double d7 asm("fr8"); fpreg[7] = d7;
+    register double d8 asm("fr9"); fpreg[8] = d8;
+    register double d9 asm("fr10"); fpreg[9] = d9;
+    register double d10 asm("fr11"); fpreg[10] = d10;
+    register double d11 asm("fr12"); fpreg[11] = d11;
+    register double d12 asm("fr13"); fpreg[12] = d12;
+
+#if CMC_DEBUG
+    for(int i = 0; i < 8; ++i)
+    {
+        fprintf(stderr, "general reg %d is %x\n", i, gpreg[i]);
+    }
+    for(int i = 0; i < 13; ++i)
+    {
+        fprintf(stderr, "sse reg %d is %f\n", i, fpreg[i]);
+        fprintf(stderr, "sse reg %d is %llx\n", i, fpreg[i]);
+    }
+    for(int i = -8; i < 8; ++i)
+    {
+        fprintf(stderr, "overflow arg %d is %x\n", i, ovrflw[i]);
+    }
+#endif
+        sal_uInt64 nRegReturn=0;
+
+        typelib_TypeClass aType =
+             cpp_mediate( nFunctionIndex, nVtableOffset, (void**)gpreg, fpreg, ovrflw, &nRegReturn );
+
+        sal_uInt32 *pRegReturn = (sal_uInt32*)&nRegReturn;
+        switch( aType )
+        {
+        case typelib_TypeClass_BOOLEAN:
+            pRegReturn[0] = (sal_uInt32)(*(char *)pRegReturn);
+            break;
+        case typelib_TypeClass_BYTE:
+            pRegReturn[0] = (sal_Int32)(*(unsigned char *)pRegReturn);
+            break;
+        case typelib_TypeClass_SHORT:
+            pRegReturn[0] = (sal_Int32)(*(short *)pRegReturn);
+            break;
+        case typelib_TypeClass_CHAR:
+        case typelib_TypeClass_UNSIGNED_SHORT:
+            pRegReturn[0] = (sal_uInt32)(*(unsigned short *)pRegReturn);
+            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;
+                case typelib_TypeClass_HYPER:
+                case typelib_TypeClass_UNSIGNED_HYPER:
+                    break;
+                default:
+            pRegReturn[0] = (sal_uInt32)(*(unsigned int*)pRegReturn);
+                    break;
+        }
+    return nRegReturn;
+}
+
+
+int const codeSnippetSize = 3 * sizeof(void*);
+
+unsigned char * codeSnippet( unsigned char * code, sal_Int16 functionIndex,
+                  sal_Int16 vtableOffset, bool simpleRetType )
+{
+    sal_uInt32 nOffsetAndIndex = ( ( vtableOffset ) << 16 ) | (functionIndex );
+    if (! simpleRetType )
+        nOffsetAndIndex |= 0x8000;
+
+    void **raw = (void**)&code[0];
+    memcpy(raw, (char*)cpp_vtable_call, 2 * sizeof(void*));
+    raw[2] = (void*)nOffsetAndIndex;
+
+    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,
+    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:
+            // Getter:
+            (s++)->fn = code;
+            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;
+                code = codeSnippet(code, functionOffset++, vtableOffset, true);
+            }
+            break;
+
+        case typelib_TypeClass_INTERFACE_METHOD:
+            (s++)->fn = code;
+            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;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
new file mode 100644
index 0000000..b40bfde
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
@@ -0,0 +1,291 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: except.cxx,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <stdio.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"
+#include <string.h>
+
+
+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( () )
+{
+#ifdef DEBUG
+    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)'.' );
+    }
+
+#ifdef DEBUG
+    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 iiFind( m_generatedRttis.find( unoName ) );
+            if (iiFind == 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;
+#ifdef DEBUG
+                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 = iiFind->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 )
+{
+    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 );
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk b/bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk
new file mode 100644
index 0000000..a543640
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/makefile.mk
@@ -0,0 +1,81 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.8 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org.  If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=bridges
+TARGET=gcc3_uno
+LIBTARGET=no
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE :  settings.mk
+
+# --- Files --------------------------------------------------------
+
+.IF "$(COM)$(OS)$(CPU)$(COMNAME)" == "GCCAIXPgcc3"
+
+.IF "$(cppu_no_leak)" == ""
+CFLAGS += -DLEAK_STATIC_DATA
+.ENDIF
+
+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
+SHL1RPATH=URELIB
+
+SHL1OBJS= $(SLOFILES)
+SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
+
+SHL1STDLIBS= \
+    $(CPPULIB)			\
+    $(SALLIB)			\
+    -ldl
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :  target.mk
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
new file mode 100644
index 0000000..0d7e627
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: share.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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 ppc
+{
+    enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
new file mode 100644
index 0000000..6937289
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
@@ -0,0 +1,502 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: uno2cpp.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_bridges.hxx"
+
+#include <sys/types.h>
+#include <sys/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;
+
+namespace
+{
+
+void MapReturn(sal_uInt32 r3, sal_uInt32 r4, double dret, typelib_TypeClass eReturnType, void *pRegisterReturn)
+{
+    switch( eReturnType )
+        {
+                case typelib_TypeClass_HYPER:
+                case typelib_TypeClass_UNSIGNED_HYPER:
+                        ((long*)pRegisterReturn)[1] = r4;
+            // fall through on purpose
+                case typelib_TypeClass_LONG:
+                case typelib_TypeClass_UNSIGNED_LONG:
+                case typelib_TypeClass_ENUM:
+                        ((long*)pRegisterReturn)[0] = r3;
+                        break;
+                case typelib_TypeClass_CHAR:
+                case typelib_TypeClass_SHORT:
+                case typelib_TypeClass_UNSIGNED_SHORT:
+                    *(unsigned short*)pRegisterReturn = (unsigned short)r3;
+                        break;
+                case typelib_TypeClass_BOOLEAN:
+                case typelib_TypeClass_BYTE:
+                    *(unsigned char*)pRegisterReturn = (unsigned char)r3;
+                        break;
+                case typelib_TypeClass_FLOAT:
+                    *(float*)pRegisterReturn = (float)dret;
+                        break;
+                case typelib_TypeClass_DOUBLE:
+                        *(double*)pRegisterReturn = dret;
+                        break;
+                default:
+                        break;
+        }
+}
+
+#define DISPLACEMENT -2
+
+static void callVirtualMethod(
+    void * pThis,
+    sal_uInt32 nVtableIndex,
+    void * pRegisterReturn,
+    typelib_TypeClass eReturnType,
+    sal_uInt32 * pStack,
+    sal_uInt32 nStack,
+    double *pFPR,
+    sal_uInt32 nFPR)
+{
+    sal_uInt32 nStackWords = nStack;
+    if (nStackWords < ppc::MAX_GPR_REGS)
+        nStackWords = 0;
+    else
+        nStackWords-=ppc::MAX_GPR_REGS;
+    if (nStackWords)
+        nStackWords = ( nStackWords + 1) & ~1;
+    sal_uInt32 *stack = (sal_uInt32*)__builtin_alloca( nStackWords * sizeof(sal_uInt32) );
+    memcpy(stack+DISPLACEMENT, pStack+ppc::MAX_GPR_REGS, nStack * sizeof(sal_uInt32));
+
+    // Get pointer to method
+    sal_uInt32 pMethod = *((sal_uInt32 *)pThis);
+    pMethod += 4 * nVtableIndex;
+    pMethod = *((sal_uInt32 *)pMethod);
+
+    typedef void (* FunctionCall )( sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32 );
+    FunctionCall pFunc = (FunctionCall)pMethod;
+
+    register double d0 asm("fr1"); d0 = pFPR[0];
+    register double d1 asm("fr2"); d1 = pFPR[1];
+    register double d2 asm("fr3"); d2 = pFPR[2];
+    register double d3 asm("fr4"); d3 = pFPR[3];
+    register double d4 asm("fr5"); d4 = pFPR[4];
+    register double d5 asm("fr6"); d5 = pFPR[5];
+    register double d6 asm("fr7"); d6 = pFPR[6];
+    register double d7 asm("fr8"); d7 = pFPR[7];
+    register double d8 asm("fr9"); d8 = pFPR[8];
+    register double d9 asm("fr10"); d9 = pFPR[9];
+    register double d10 asm("fr11"); d10 = pFPR[10];
+    register double d11 asm("fr12"); d11 = pFPR[11];
+    register double d12 asm("fr13"); d12 = pFPR[12];
+
+    (*pFunc)(pStack[0], pStack[1], pStack[2], pStack[3], pStack[4], pStack[5], pStack[6], pStack[7]);
+
+    register sal_uInt32 r3 asm("r3");
+    register sal_uInt32 r4 asm("r4");
+    MapReturn(r3, r4, d0, eReturnType, pRegisterReturn);
+}
+
+#define INSERT_INT32(pSV, pDS) \
+{ \
+    *pDS++ = *reinterpret_cast<sal_uInt32 *>(pSV); \
+}
+
+#define INSERT_INT16(pSV, pDS) \
+{ \
+    *pDS++ = *reinterpret_cast<sal_uInt16 *>(pSV); \
+}
+
+#define INSERT_INT8(pSV, pDS) \
+{ \
+    *pDS++ = *reinterpret_cast<sal_uInt8 *>(pSV); \
+}
+
+#define INSERT_FLOAT(pSV, nr, pFPR, pDS) \
+{ \
+    if (nr < ppc::MAX_SSE_REGS) \
+    { \
+        sal_uInt32 *pDouble = (sal_uInt32 *)&(pFPR[nr++]); \
+        pDouble[0] = *reinterpret_cast<sal_uInt32 *>(pSV); \
+    } \
+    *pDS++ = *reinterpret_cast<sal_uInt32 *>(pSV); \
+}
+
+#define INSERT_DOUBLE(pSV, nr, pFPR, pDS) \
+{ \
+    if (nr < ppc::MAX_SSE_REGS) \
+    { \
+        pFPR[nr++] = *reinterpret_cast<double *>(pSV); \
+    } \
+    *pDS++ = reinterpret_cast<sal_uInt32 *>(pSV)[1]; \
+    *pDS++ = reinterpret_cast<sal_uInt32 *>(pSV)[0]; \
+}
+
+#define INSERT_INT64(pSV, pDS) \
+{ \
+    INSERT_INT32(pSV, pDS) \
+    INSERT_INT32(((sal_uInt32*)pSV)+1, pDS) \
+}
+//==================================================================================================
+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;
+
+    double pFPR[ppc::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
+
+    if (pReturnTypeDescr)
+    {
+        if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+        {
+            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, pStack);
+                }
+        }
+        // push this
+    void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset;
+        INSERT_INT32(&pAdjustedThisPtr, pStack);
+
+        // stack space
+        OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+        // args
+        void ** pCppArgs  = (void **)__builtin_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], pParamTypeDescr,
+                                                                        pThis->getBridge()->getUno2Cpp() );
+
+                        switch (pParamTypeDescr->eTypeClass)
+                        {
+                        case typelib_TypeClass_LONG:
+                        case typelib_TypeClass_UNSIGNED_LONG:
+                        case typelib_TypeClass_ENUM:
+                                INSERT_INT32(pCppArgs[nPos], pStack);
+                                break;
+                        case typelib_TypeClass_SHORT:
+                        case typelib_TypeClass_CHAR:
+                        case typelib_TypeClass_UNSIGNED_SHORT:
+                    INSERT_INT16(pCppArgs[nPos], pStack);
+                    break;
+                        case typelib_TypeClass_BOOLEAN:
+                        case typelib_TypeClass_BYTE:
+                    INSERT_INT8(pCppArgs[nPos], pStack);
+                    break;
+                        case typelib_TypeClass_FLOAT:
+                    INSERT_FLOAT(pCppArgs[nPos], nFPR, pFPR, pStack);
+                                break;
+                        case typelib_TypeClass_DOUBLE:
+                                INSERT_DOUBLE(pCppArgs[nPos], nFPR, pFPR, pStack);
+                                break;
+                            case typelib_TypeClass_HYPER:
+                            case typelib_TypeClass_UNSIGNED_HYPER:
+                                INSERT_INT64(pCppArgs[nPos], pStack);
+                                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] = __builtin_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] = __builtin_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]), pStack);
+                }
+        }
+
+        try
+        {
+                OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 3), "UNALIGNED STACK !!! (Please DO panic)" );
+                callVirtualMethod(
+                        pAdjustedThisPtr, aVtableSlot.index,
+                        pCppReturn, pReturnTypeDescr->eTypeClass,
+                        pStackStart, (pStack - pStackStart), pFPR, nFPR );
+                // NO exception occured...
+                *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 );
+        }
+        }
+}
+
+} } }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list