[Libreoffice-commits] core.git: bridges/source config_host/config_cxxabi.h.in configure.ac cppuhelper/qa

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sat Aug 4 13:37:50 UTC 2018


 bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx      |    7 ++-
 bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx       |    6 +--
 bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx     |    2 -
 bridges/source/cpp_uno/gcc3_ios/except.cxx              |    7 ++-
 bridges/source/cpp_uno/gcc3_ios/share.hxx               |    3 -
 bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx             |    2 -
 bridges/source/cpp_uno/gcc3_linux_alpha/except.cxx      |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_alpha/share.hxx       |    3 -
 bridges/source/cpp_uno/gcc3_linux_alpha/uno2cpp.cxx     |    3 -
 bridges/source/cpp_uno/gcc3_linux_arm/except.cxx        |    5 ++
 bridges/source/cpp_uno/gcc3_linux_arm/share.hxx         |    9 +++-
 bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx       |    4 --
 bridges/source/cpp_uno/gcc3_linux_hppa/except.cxx       |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_hppa/share.hxx        |    6 +--
 bridges/source/cpp_uno/gcc3_linux_hppa/uno2cpp.cxx      |    2 -
 bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx       |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx        |    6 +--
 bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx      |    7 +--
 bridges/source/cpp_uno/gcc3_linux_intel/except.cxx      |    8 +++-
 bridges/source/cpp_uno/gcc3_linux_intel/share.hxx       |    9 +++-
 bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx     |   11 ++---
 bridges/source/cpp_uno/gcc3_linux_m68k/except.cxx       |    5 ++
 bridges/source/cpp_uno/gcc3_linux_m68k/share.hxx        |    6 +--
 bridges/source/cpp_uno/gcc3_linux_m68k/uno2cpp.cxx      |    2 -
 bridges/source/cpp_uno/gcc3_linux_mips/except.cxx       |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_mips/share.hxx        |    6 +--
 bridges/source/cpp_uno/gcc3_linux_mips/uno2cpp.cxx      |    3 -
 bridges/source/cpp_uno/gcc3_linux_mips64/except.cxx     |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_mips64/share.hxx      |    6 +--
 bridges/source/cpp_uno/gcc3_linux_mips64/uno2cpp.cxx    |    3 -
 bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx    |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_powerpc/share.hxx     |    6 +--
 bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx   |    9 ++--
 bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx  |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx   |    6 +--
 bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx |    9 ++--
 bridges/source/cpp_uno/gcc3_linux_s390/except.cxx       |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_s390/share.hxx        |    6 +--
 bridges/source/cpp_uno/gcc3_linux_s390/uno2cpp.cxx      |    9 ++--
 bridges/source/cpp_uno/gcc3_linux_s390x/except.cxx      |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_s390x/share.hxx       |    5 +-
 bridges/source/cpp_uno/gcc3_linux_s390x/uno2cpp.cxx     |    3 -
 bridges/source/cpp_uno/gcc3_linux_sparc/except.cxx      |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_sparc/share.hxx       |    4 +-
 bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx     |    9 ++--
 bridges/source/cpp_uno/gcc3_linux_sparc64/except.cxx    |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_sparc64/share.hxx     |    4 +-
 bridges/source/cpp_uno/gcc3_linux_sparc64/uno2cpp.cxx   |    9 ++--
 bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx     |    7 ++-
 bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx      |    9 +++-
 bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx    |    4 --
 bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx    |    7 ++-
 bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx     |    3 -
 bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx   |    8 ++--
 bridges/source/cpp_uno/gcc3_solaris_intel/except.cxx    |    7 ++-
 bridges/source/cpp_uno/gcc3_solaris_intel/share.hxx     |    5 +-
 bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx   |    8 ++--
 bridges/source/cpp_uno/gcc3_solaris_sparc/except.cxx    |    7 ++-
 bridges/source/cpp_uno/gcc3_solaris_sparc/share.hxx     |    4 +-
 bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx   |    9 ++--
 config_host/config_cxxabi.h.in                          |    1 
 configure.ac                                            |   11 +++++
 cppuhelper/qa/misc/test_misc.cxx                        |   32 ++++++++++++++++
 63 files changed, 253 insertions(+), 156 deletions(-)

New commits:
commit 6ddecf61ecada646fbd6f8809270d47289727e8a
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Aug 2 15:13:37 2018 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Sat Aug 4 15:37:30 2018 +0200

    fillUnoException not working on std::rethrow_exception exceptions
    
    used since...
    
    commit dacc1b40df67d154c96b256b0d920460f38c3d11
    Date:   Sat Jul 28 16:33:22 2018 +0100
    
        ofz#9597 rethrown IOException not caught by catch IOException
    
    the adjustedPtr seems to be as expected, but the type_info not.  Presumably
    these are thrown as 'dependent exceptions' (?)
    https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/eh_type.cc#L42
    
    Change-Id: Ibd736abe941bb1d5facdb88139b3a0e6cf32cf1f
    Reviewed-on: https://gerrit.libreoffice.org/58477
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
index fe3c1f391147..bde3233e1491 100644
--- a/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
@@ -245,13 +245,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
 }
 
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
index ce2a34c417f9..c34033a53e72 100644
--- a/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
@@ -72,14 +72,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 namespace ppc
diff --git a/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
index 1c8045fafe26..9e2fa40f1a43 100644
--- a/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
@@ -353,7 +353,7 @@ static void cpp_call(
         catch (...)
         {
                 // fill uno exception
-                fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+                CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
                 // temporary params
                 for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_ios/except.cxx b/bridges/source/cpp_uno/gcc3_ios/except.cxx
index 747ebe3d7144..ae0348957312 100644
--- a/bridges/source/cpp_uno/gcc3_ios/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_ios/except.cxx
@@ -344,8 +344,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxxabiv1::__cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -355,8 +356,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxxabiv1::__cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = nullptr;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_ios/share.hxx b/bridges/source/cpp_uno/gcc3_ios/share.hxx
index bcddcdb1f807..120c5d5a5563 100644
--- a/bridges/source/cpp_uno/gcc3_ios/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_ios/share.hxx
@@ -41,8 +41,7 @@ namespace CPPU_CURRENT_NAMESPACE
     void raiseException(
         uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-    void fillUnoException(
-        __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+    void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 
     bool isSimpleReturnType(typelib_TypeDescription * pTD, bool recursive = false);
 }
diff --git a/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx
index 9287bb4ea224..916961c69caf 100644
--- a/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx
@@ -412,7 +412,7 @@ static void cpp_call(
     catch (...)
     {
         // fill uno exception
-        CPPU_CURRENT_NAMESPACE::fillUnoException( abi::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_alpha/except.cxx b/bridges/source/cpp_uno/gcc3_linux_alpha/except.cxx
index 1a51c6e6786a..f0be82713583 100644
--- a/bridges/source/cpp_uno/gcc3_linux_alpha/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_alpha/except.cxx
@@ -242,13 +242,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_linux_alpha/share.hxx b/bridges/source/cpp_uno/gcc3_linux_alpha/share.hxx
index dc199bdc1b94..944b4fd18859 100644
--- a/bridges/source/cpp_uno/gcc3_linux_alpha/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_alpha/share.hxx
@@ -77,8 +77,7 @@ 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 );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 namespace axp
diff --git a/bridges/source/cpp_uno/gcc3_linux_alpha/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_alpha/uno2cpp.cxx
index 143b1533479c..0d77decd722a 100644
--- a/bridges/source/cpp_uno/gcc3_linux_alpha/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_alpha/uno2cpp.cxx
@@ -384,8 +384,7 @@ static void cpp_call(
     catch (...)
     {
         // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-            *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
 
         // temporary params
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx b/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx
index b4a5117b81c0..d6e4c0daacd3 100644
--- a/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx
@@ -300,6 +300,7 @@ namespace CPPU_CURRENT_NAMESPACE
 
     void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
     {
+        __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
         if (! header)
         {
             RuntimeException aRE( "no exception header!" );
@@ -309,8 +310,10 @@ namespace CPPU_CURRENT_NAMESPACE
             return;
         }
 
+        std::type_info *exceptionType = __cxa_current_exception_type();
+
         typelib_TypeDescription * pExcTypeDescr = nullptr;
-        OUString unoName( toUNOname( header->exceptionType->name() ) );
+        OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
         OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
         fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/share.hxx b/bridges/source/cpp_uno/gcc3_linux_arm/share.hxx
index 3c3b46bfd6eb..d7b7ff370b52 100644
--- a/bridges/source/cpp_uno/gcc3_linux_arm/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_arm/share.hxx
@@ -123,12 +123,17 @@ namespace __cxxabiv1 {
 }
 #endif
 
+#if !HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE
+namespace __cxxabiv1 {
+    extern "C" std::type_info *__cxa_current_exception_type() throw();
+}
+#endif
+
 namespace CPPU_CURRENT_NAMESPACE
 {
     void raiseException(
         uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
-    void fillUnoException(
-        __cxxabiv1::__cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+    void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 extern "C" void privateSnippetExecutor();
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
index b8deb4ba7439..852252969b37 100644
--- a/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
@@ -585,9 +585,7 @@ static void cpp_call(
     catch (...)
     {
         // fill uno exception
-        CPPU_CURRENT_NAMESPACE::fillUnoException(
-             __cxxabiv1::__cxa_get_globals()->caughtExceptions,
-             *ppUnoExc, pThis->getBridge()->getCpp2Uno());
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_hppa/except.cxx b/bridges/source/cpp_uno/gcc3_linux_hppa/except.cxx
index 3464ad7c3d39..c3033fb49a2a 100644
--- a/bridges/source/cpp_uno/gcc3_linux_hppa/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_hppa/except.cxx
@@ -266,8 +266,9 @@ namespace CPPU_CURRENT_NAMESPACE
         return header->adjustedPtr;
     }
 
-    void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+    void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
     {
+        __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
         if (! header)
         {
             RuntimeException aRE( "no exception header!" );
@@ -277,8 +278,10 @@ namespace CPPU_CURRENT_NAMESPACE
             return;
         }
 
+        std::type_info *exceptionType = __cxa_current_exception_type();
+
         typelib_TypeDescription * pExcTypeDescr = 0;
-        OUString unoName( toUNOname( header->exceptionType->name() ) );
+        OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
         OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
         fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_hppa/share.hxx b/bridges/source/cpp_uno/gcc3_linux_hppa/share.hxx
index dd084e340a1e..5a65eeeef275 100644
--- a/bridges/source/cpp_uno/gcc3_linux_hppa/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_hppa/share.hxx
@@ -72,14 +72,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 
diff --git a/bridges/source/cpp_uno/gcc3_linux_hppa/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_hppa/uno2cpp.cxx
index 656f55c6b29e..d15e47f321d2 100644
--- a/bridges/source/cpp_uno/gcc3_linux_hppa/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_hppa/uno2cpp.cxx
@@ -366,7 +366,7 @@ static void cpp_call(
     catch (...)
     {
         // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
index 27d6bc1a2cbe..9145071519ce 100644
--- a/bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
@@ -241,13 +241,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
index 59ff09b72621..30111698ec6b 100644
--- a/bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
@@ -73,14 +73,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 namespace ia64
diff --git a/bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
index bf9b06bc2952..e1a602e5e766 100644
--- a/bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
@@ -544,11 +544,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
+    catch (...)
+    {
           // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-                                  *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx b/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx
index b06bd4b28f35..108c5c843744 100644
--- a/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx
@@ -265,8 +265,10 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = reinterpret_cast<CPPU_CURRENT_NAMESPACE::__cxa_eh_globals*>(
+                 __cxxabiv1::__cxa_get_globals())->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -276,8 +278,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxxabiv1::__cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = nullptr;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx b/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx
index 307f12a8a922..fb8f25353918 100644
--- a/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx
@@ -84,6 +84,12 @@ struct __cxa_eh_globals
 namespace __cxxabiv1 { extern "C" void * __cxa_get_globals() throw(); }
 #endif
 
+#if !HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE
+namespace __cxxabiv1 {
+extern "C" std::type_info *__cxa_current_exception_type() throw();
+}
+#endif
+
 #if !HAVE_CXXABI_H_CXA_ALLOCATE_EXCEPTION
 namespace __cxxabiv1 {
 extern "C" void * __cxa_allocate_exception(std::size_t thrown_size) throw();
@@ -111,8 +117,7 @@ namespace CPPU_CURRENT_NAMESPACE
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 
 }
 
diff --git a/bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx
index ff8618cf8171..1061a00c76c0 100644
--- a/bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx
@@ -211,13 +211,10 @@ void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
-         // fill uno exception
-         fillUnoException(
-             reinterpret_cast< CPPU_CURRENT_NAMESPACE::__cxa_eh_globals * >(
-                 __cxxabiv1::__cxa_get_globals())->caughtExceptions,
-             *ppUnoExc, pThis->getBridge()->getCpp2Uno());
+    catch (...)
+    {
+        // fill uno exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_m68k/except.cxx b/bridges/source/cpp_uno/gcc3_linux_m68k/except.cxx
index 27a587117145..051f5408cba3 100644
--- a/bridges/source/cpp_uno/gcc3_linux_m68k/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_m68k/except.cxx
@@ -268,6 +268,7 @@ namespace CPPU_CURRENT_NAMESPACE
 
     void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
     {
+        __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
         if (! header)
         {
             RuntimeException aRE( "no exception header!" );
@@ -277,8 +278,10 @@ namespace CPPU_CURRENT_NAMESPACE
             return;
         }
 
+        std::type_info *exceptionType = __cxa_current_exception_type();
+
         typelib_TypeDescription * pExcTypeDescr = 0;
-        OUString unoName( toUNOname( header->exceptionType->name() ) );
+        OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
         OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
         fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_m68k/share.hxx b/bridges/source/cpp_uno/gcc3_linux_m68k/share.hxx
index 01655c480e1d..e97a018855d5 100644
--- a/bridges/source/cpp_uno/gcc3_linux_m68k/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_m68k/share.hxx
@@ -72,14 +72,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 #endif
diff --git a/bridges/source/cpp_uno/gcc3_linux_m68k/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_m68k/uno2cpp.cxx
index ca3a2477ebc5..dbe7896d1ceb 100644
--- a/bridges/source/cpp_uno/gcc3_linux_m68k/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_m68k/uno2cpp.cxx
@@ -344,7 +344,7 @@ static void cpp_call(
     catch (...)
     {
         // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_mips/except.cxx b/bridges/source/cpp_uno/gcc3_linux_mips/except.cxx
index 01a4446eb19c..a2d5cfb67c18 100644
--- a/bridges/source/cpp_uno/gcc3_linux_mips/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_mips/except.cxx
@@ -257,8 +257,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -268,8 +269,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if defined BRIDGES_DEBUG
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_mips/share.hxx b/bridges/source/cpp_uno/gcc3_linux_mips/share.hxx
index 5c4dac85b249..f27a896cf5a9 100644
--- a/bridges/source/cpp_uno/gcc3_linux_mips/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_mips/share.hxx
@@ -72,14 +72,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 #endif
diff --git a/bridges/source/cpp_uno/gcc3_linux_mips/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_mips/uno2cpp.cxx
index 259775f25708..98efa29ecbd8 100644
--- a/bridges/source/cpp_uno/gcc3_linux_mips/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_mips/uno2cpp.cxx
@@ -449,8 +449,7 @@ namespace
     catch (...)
     {
       // fill uno exception
-      fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-          *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+      CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
       // temporary params
       for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_mips64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_mips64/except.cxx
index e17e5fba14bf..8fc4d970bba7 100644
--- a/bridges/source/cpp_uno/gcc3_linux_mips64/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_mips64/except.cxx
@@ -258,8 +258,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -269,8 +270,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if defined BRIDGES_DEBUG
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_mips64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_mips64/share.hxx
index 73c60aa05abc..b6821675c320 100644
--- a/bridges/source/cpp_uno/gcc3_linux_mips64/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_mips64/share.hxx
@@ -75,14 +75,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 
 bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
 }
diff --git a/bridges/source/cpp_uno/gcc3_linux_mips64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_mips64/uno2cpp.cxx
index b65a7819a405..abb43c1fea8a 100644
--- a/bridges/source/cpp_uno/gcc3_linux_mips64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_mips64/uno2cpp.cxx
@@ -440,8 +440,7 @@ namespace
     catch (...)
     {
       // fill uno exception
-      fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-          *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+      CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
       // temporary params
       for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx
index cd6c79581736..475c6f506b1d 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx
@@ -243,13 +243,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc/share.hxx b/bridges/source/cpp_uno/gcc3_linux_powerpc/share.hxx
index be81af026eac..ad6ca4c946fb 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc/share.hxx
@@ -72,14 +72,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 #endif
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
index 7fdd362906ce..a08f12389c90 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
@@ -536,11 +536,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
-          // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-                                  *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch (...)
+    {
+        // fill uno exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx
index 27d6bc1a2cbe..9145071519ce 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx
@@ -241,13 +241,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx
index 21df650f7ae0..b5bc1102bf20 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx
@@ -72,14 +72,14 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 namespace ppc64
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
index b58a515121f2..0933315f91b4 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
@@ -512,11 +512,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
-          // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-                                  *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch (...)
+    {
+        // fill uno exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_s390/except.cxx b/bridges/source/cpp_uno/gcc3_linux_s390/except.cxx
index 1a51c6e6786a..f0be82713583 100644
--- a/bridges/source/cpp_uno/gcc3_linux_s390/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_s390/except.cxx
@@ -242,13 +242,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_linux_s390/share.hxx b/bridges/source/cpp_uno/gcc3_linux_s390/share.hxx
index aacbd05fa568..aa1ecdfdc3d4 100644
--- a/bridges/source/cpp_uno/gcc3_linux_s390/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_s390/share.hxx
@@ -72,13 +72,13 @@ struct __cxa_eh_globals
     __cxa_exception *caughtExceptions;
     unsigned int uncaughtExceptions;
 };
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
 
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 #endif
diff --git a/bridges/source/cpp_uno/gcc3_linux_s390/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_s390/uno2cpp.cxx
index fda52d056ebc..663cf435d5b3 100644
--- a/bridges/source/cpp_uno/gcc3_linux_s390/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_s390/uno2cpp.cxx
@@ -482,11 +482,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
-          // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-            *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch (...)
+    {
+        // fill uno exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
 
         // temporary params
diff --git a/bridges/source/cpp_uno/gcc3_linux_s390x/except.cxx b/bridges/source/cpp_uno/gcc3_linux_s390x/except.cxx
index 9fc893371039..52c8e603a992 100644
--- a/bridges/source/cpp_uno/gcc3_linux_s390x/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_s390x/except.cxx
@@ -242,13 +242,16 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
         terminate();
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
     ::typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
     if (! pExcTypeDescr)
         terminate();
diff --git a/bridges/source/cpp_uno/gcc3_linux_s390x/share.hxx b/bridges/source/cpp_uno/gcc3_linux_s390x/share.hxx
index 9de4b6f485f6..00dc7201dc90 100644
--- a/bridges/source/cpp_uno/gcc3_linux_s390x/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_s390x/share.hxx
@@ -73,12 +73,11 @@ struct __cxa_eh_globals
     unsigned int uncaughtExceptions;
 };
 extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
-
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 namespace s390x
diff --git a/bridges/source/cpp_uno/gcc3_linux_s390x/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_s390x/uno2cpp.cxx
index e7354a4ba8c5..faf5dc044c52 100644
--- a/bridges/source/cpp_uno/gcc3_linux_s390x/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_s390x/uno2cpp.cxx
@@ -389,8 +389,7 @@ static void cpp_call(
     catch (...)
     {
         // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-            *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
 
         // temporary params
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc/except.cxx b/bridges/source/cpp_uno/gcc3_linux_sparc/except.cxx
index 457ab485d21a..2535da049848 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc/except.cxx
@@ -259,8 +259,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -270,8 +271,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if defined BRIDGES_DEBUG
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc/share.hxx b/bridges/source/cpp_uno/gcc3_linux_sparc/share.hxx
index 95f0c15f660c..da781a3b1ef4 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc/share.hxx
@@ -68,12 +68,12 @@ struct __cxa_eh_globals
     unsigned int uncaughtExceptions;
 };
 extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 
 inline char* adjustPointer( char* pIn, typelib_TypeDescription* pType )
 {
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
index 39b625fb35c2..43b73257261a 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
@@ -456,11 +456,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch( ... )
-     {
-         // get exception
-           fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-                                *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch( ... )
+    {
+        // get exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_sparc64/except.cxx
index 457ab485d21a..2535da049848 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc64/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc64/except.cxx
@@ -259,8 +259,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -270,8 +271,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if defined BRIDGES_DEBUG
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_sparc64/share.hxx
index 5cd1b32f6355..b7f9980d218a 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc64/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc64/share.hxx
@@ -68,12 +68,12 @@ struct __cxa_eh_globals
     unsigned int uncaughtExceptions;
 };
 extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 
 bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef );
 
diff --git a/bridges/source/cpp_uno/gcc3_linux_sparc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_sparc64/uno2cpp.cxx
index 81012dfdcda3..de17e3ca5d07 100644
--- a/bridges/source/cpp_uno/gcc3_linux_sparc64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_sparc64/uno2cpp.cxx
@@ -700,11 +700,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch( ... )
-     {
-         // get exception
-           fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-                                *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch( ... )
+    {
+        // get exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx
index 762d1392b34e..ad2b9f702c5d 100644
--- a/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx
@@ -138,8 +138,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxxabiv1::__cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxxabiv1::__cxa_exception * header = __cxxabiv1::__cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -149,8 +150,10 @@ void fillUnoException( __cxxabiv1::__cxa_exception * header, uno_Any * pUnoExc,
         return;
     }
 
+    std::type_info *exceptionType = __cxxabiv1::__cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = nullptr;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx
index 55009d5f7480..94ad43ae922c 100644
--- a/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx
@@ -143,6 +143,12 @@ extern "C" __cxa_eh_globals * __cxa_get_globals() throw();
 }
 #endif
 
+#if !HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE
+namespace __cxxabiv1 {
+extern "C" std::type_info *__cxa_current_exception_type() throw();
+}
+#endif
+
 #if !HAVE_CXXABI_H_CXA_ALLOCATE_EXCEPTION
 namespace __cxxabiv1 {
 extern "C" void * __cxa_allocate_exception(std::size_t thrown_size) throw();
@@ -165,8 +171,7 @@ namespace CPPU_CURRENT_NAMESPACE
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxxabiv1::__cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
index 929e0e2945aa..b038a0247963 100644
--- a/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
@@ -283,9 +283,7 @@ static void cpp_call(
      catch (...)
      {
          // fill uno exception
-         CPPU_CURRENT_NAMESPACE::fillUnoException(
-             __cxxabiv1::__cxa_get_globals()->caughtExceptions,
-             *ppUnoExc, pThis->getBridge()->getCpp2Uno());
+         CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx b/bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx
index 541e251506dd..12058c53a2a2 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx
@@ -341,8 +341,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -352,8 +353,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxxabiv1::__cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = nullptr;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx b/bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx
index 3eb88cdc0242..39939ab6be72 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx
@@ -136,8 +136,7 @@ namespace CPPU_CURRENT_NAMESPACE
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 #endif
diff --git a/bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx
index ae1dab7e1702..13002709436d 100644
--- a/bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx
@@ -280,10 +280,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
-          // fill uno exception
-        fillUnoException( __cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch (...)
+    {
+        // fill uno exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_solaris_intel/except.cxx b/bridges/source/cpp_uno/gcc3_solaris_intel/except.cxx
index 0b484521f7a1..263733677158 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_intel/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_intel/except.cxx
@@ -260,8 +260,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -271,8 +272,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if OSL_DEBUG_LEVEL > 1
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_solaris_intel/share.hxx b/bridges/source/cpp_uno/gcc3_solaris_intel/share.hxx
index 0fe413f6827c..2fbbe1989809 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_intel/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_intel/share.hxx
@@ -72,13 +72,12 @@ struct __cxa_eh_globals
     unsigned int uncaughtExceptions;
 };
 extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
-
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 }
 
 #endif
diff --git a/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
index 7ad7d1955a44..5b17378b911f 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
@@ -208,10 +208,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch (...)
-     {
-          // fill uno exception
-        fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch (...)
+    {
+        // fill uno exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/bridges/source/cpp_uno/gcc3_solaris_sparc/except.cxx b/bridges/source/cpp_uno/gcc3_solaris_sparc/except.cxx
index 18326431dbad..6545e4820f11 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_sparc/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_sparc/except.cxx
@@ -257,8 +257,9 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
     __cxa_throw( pCppExc, rtti, deleteException );
 }
 
-void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
 {
+    __cxa_exception * header = __cxa_get_globals()->caughtExceptions;
     if (! header)
     {
         RuntimeException aRE( "no exception header!" );
@@ -268,8 +269,10 @@ void fillUnoException( __cxa_exception * header, uno_Any * pUnoExc, uno_Mapping
         return;
     }
 
+    std::type_info *exceptionType = __cxa_current_exception_type();
+
     typelib_TypeDescription * pExcTypeDescr = 0;
-    OUString unoName( toUNOname( header->exceptionType->name() ) );
+    OUString unoName( toUNOname( exceptionType->name() ) );
 #if defined BRIDGES_DEBUG
     OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) );
     fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
diff --git a/bridges/source/cpp_uno/gcc3_solaris_sparc/share.hxx b/bridges/source/cpp_uno/gcc3_solaris_sparc/share.hxx
index af42fba6a4ba..b7de110a2b39 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_sparc/share.hxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_sparc/share.hxx
@@ -68,12 +68,12 @@ struct __cxa_eh_globals
     unsigned int uncaughtExceptions;
 };
 extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" std::type_info *__cxa_current_exception_type() throw();
 
 void raiseException(
     uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
 
-void fillUnoException(
-    __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno );
+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
 
 inline char* adjustPointer( char* pIn, typelib_TypeDescription* pType )
 {
diff --git a/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
index dbfcc1c66b2b..5b42401caed3 100644
--- a/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
@@ -451,11 +451,10 @@ static void cpp_call(
             uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
         }
     }
-     catch( ... )
-     {
-         // get exception
-           fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions,
-                                *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
+    catch( ... )
+    {
+        // get exception
+        CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno());
 
         // temporary params
         for ( ; nTempIndices--; )
diff --git a/config_host/config_cxxabi.h.in b/config_host/config_cxxabi.h.in
index 74a226b3eb9f..0acaa560529f 100644
--- a/config_host/config_cxxabi.h.in
+++ b/config_host/config_cxxabi.h.in
@@ -16,6 +16,7 @@
 #define HAVE_CXXABI_H_CXA_EH_GLOBALS 0
 #define HAVE_CXXABI_H_CXA_EXCEPTION 0
 #define HAVE_CXXABI_H_CXA_GET_GLOBALS 0
+#define HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE 0
 #define HAVE_CXXABI_H_CXA_THROW 0
 #define HAVE_CXXABI_H_SI_CLASS_TYPE_INFO 0
 #define HAVE_CXXABI_H_VMI_CLASS_TYPE_INFO 0
diff --git a/configure.ac b/configure.ac
index 25d85b435361..9a0c2c3083e3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6028,6 +6028,17 @@ if test "$GCC" = "yes" -o "$COM_IS_CLANG" = TRUE; then
         ], [AC_MSG_RESULT([no])])
     AC_LANG_POP([C++])
 
+    AC_MSG_CHECKING([whether $CXX declares __cxa_current_exception_type in cxxabi.h])
+    AC_LANG_PUSH([C++])
+    AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+            #include <cxxabi.h>
+            void * f() { return __cxxabiv1::__cxa_current_exception_type(); }
+        ])], [
+            AC_DEFINE([HAVE_CXXABI_H_CXA_CURRENT_EXCEPTION_TYPE],[1])
+            AC_MSG_RESULT([yes])
+        ], [AC_MSG_RESULT([no])])
+    AC_LANG_POP([C++])
+
     AC_MSG_CHECKING([whether $CXX declares __cxa_throw in cxxabi.h])
     AC_LANG_PUSH([C++])
     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
diff --git a/cppuhelper/qa/misc/test_misc.cxx b/cppuhelper/qa/misc/test_misc.cxx
index 151eb15ea1f6..0e4fdf9efb42 100644
--- a/cppuhelper/qa/misc/test_misc.cxx
+++ b/cppuhelper/qa/misc/test_misc.cxx
@@ -19,9 +19,11 @@ class Test : public ::CppUnit::TestFixture
 {
 public:
     void testCatchThrow();
+    void testgetCaughtException();
 
     CPPUNIT_TEST_SUITE(Test);
     CPPUNIT_TEST(testCatchThrow);
+    CPPUNIT_TEST(testgetCaughtException);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -51,6 +53,36 @@ void Test::testCatchThrow()
     }
 }
 
+void Test::testgetCaughtException()
+{
+    css::uno::Any aSavedExceptionAny;
+    std::exception_ptr
+        aSavedException; /// exception caught during unzipping is saved to be thrown during reading
+    try
+    {
+        throw css::uno::RuntimeException("RuntimeException");
+    }
+    catch (...)
+    {
+        aSavedException = std::current_exception();
+    }
+    CPPUNIT_ASSERT(bool(aSavedException));
+    try
+    {
+        std::rethrow_exception(aSavedException);
+    }
+    catch (const css::uno::RuntimeException&)
+    {
+        // the expected case
+        aSavedExceptionAny = cppu::getCaughtException();
+    }
+    catch (...)
+    {
+        CPPUNIT_ASSERT(false);
+    }
+    CPPUNIT_ASSERT(aSavedExceptionAny.hasValue());
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 }
 


More information about the Libreoffice-commits mailing list