tdf#128671: Rely on unwind.h, declare what's missing from cxxabi.h

...for gcc3_linux_aarch64, similar to what
128deeae81a6f802bfb79b8f0fa8c4b10729f7db "cxxabi.h is not specific to GCC" et al
did for gcc3_linux_x86-64

Change-Id: Iee9980842c0e5f6f49642407339a67e865f8be9c
Reviewed-on: https://gerrit.libreoffice.org/85344
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx
index 938011a..892bf6e 100644
--- a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx
@@ -24,7 +24,6 @@
#include <cstring>
#include <typeinfo>

#include <cxxabi.h>
#include <dlfcn.h>

#include <com/sun/star/uno/RuntimeException.hpp>
@@ -135,8 +134,8 @@ std::type_info * getRtti(typelib_TypeDescription const & type) {
}

extern "C" void _GLIBCXX_CDTOR_CALLABI deleteException(void * exception) {
    abi_aarch64::__cxa_exception * header =
        static_cast<abi_aarch64::__cxa_exception *>(exception) - 1;
    __cxxabiv1::__cxa_exception * header =
        static_cast<__cxxabiv1::__cxa_exception *>(exception) - 1;
    OUString unoName(toUnoName(header->exceptionType->name()));
    typelib_TypeDescription * td = 0;
    typelib_typedescription_getByName(&td, unoName.pData);
@@ -224,7 +223,7 @@ StructKind getStructKind(typelib_CompoundTypeDescription const * type) {
namespace abi_aarch64 {

void mapException(
    __cxa_exception * exception, std::type_info const * type, uno_Any * any, uno_Mapping * mapping)
    __cxxabiv1::__cxa_exception * exception, std::type_info const * type, uno_Any * any, uno_Mapping * mapping)
{
    assert(exception != 0);
    assert(type != nullptr);
diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx
index 50c5f1f..e3dc9b5 100644
--- a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx
+++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx
@@ -22,55 +22,114 @@

#include <sal/config.h>

#include <cstddef>
#include <exception>
#include <typeinfo>

#include <cxxabi.h>
#ifndef _GLIBCXX_CDTOR_CALLABI // new in GCC 4.7 cxxabi.h
#define _GLIBCXX_CDTOR_CALLABI
#endif
#include <unwind.h>

#include <config_cxxabi.h>
#include <typelib/typedescription.h>
#include <uno/any2.h>
#include <uno/mapping.h>

namespace abi_aarch64 {
#if !HAVE_CXXABI_H_CLASS_TYPE_INFO
// <https://mentorembedded.github.io/cxx-abi/abi.html>,
// libstdc++-v3/libsupc++/cxxabi.h:
namespace __cxxabiv1 {
class __class_type_info: public std::type_info {
public:
    explicit __class_type_info(char const * n): type_info(n) {}
    ~__class_type_info() override;
};
}
#endif

// Following declarations from libstdc++-v3/libsupc++/unwind-cxx.h and
// lib/gcc/*-*-*/*/include/unwind.h:
#if !HAVE_CXXABI_H_SI_CLASS_TYPE_INFO
// <https://mentorembedded.github.io/cxx-abi/abi.html>,
// libstdc++-v3/libsupc++/cxxabi.h:
namespace __cxxabiv1 {
class __si_class_type_info: public __class_type_info {
public:
    __class_type_info const * __base_type;
    explicit __si_class_type_info(
        char const * n, __class_type_info const *base):
        __class_type_info(n), __base_type(base) {}
    ~__si_class_type_info() override;
};
}
#endif

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 *);

#if !HAVE_CXXABI_H_CXA_EXCEPTION
// <https://mentorembedded.github.io/cxx-abi/abi-eh.html>,
// libcxxabi/src/cxa_exception.hpp:
namespace __cxxabiv1 {
struct __cxa_exception {
#if defined _LIBCPPABI_VERSION // detect libc++abi
#if defined __LP64__ || LIBCXXABI_ARM_EHABI
    std::size_t referenceCount;
#endif
#endif
    std::type_info * exceptionType;
    void (* exceptionDestructor)(void *);
    void (*unexpectedHandler)(); // std::unexpected_handler dropped from C++17
    std::terminate_handler terminateHandler;

    __cxa_exception *nextException;

    __cxa_exception * nextException;
    int handlerCount;

    int handlerSwitchValue;
    const unsigned char *actionRecord;
    const unsigned char *languageSpecificData;
    void *catchTemp;
    void *adjustedPtr;

    char const * actionRecord;
    char const * languageSpecificData;
    void * catchTemp;
    void * adjustedPtr;
    _Unwind_Exception unwindHeader;
};
}
#endif

struct __cxa_eh_globals
{
    __cxa_exception *caughtExceptions;
#if !HAVE_CXXABI_H_CXA_EH_GLOBALS
// <https://mentorembedded.github.io/cxx-abi/abi-eh.html>:
namespace __cxxabiv1 {
struct __cxa_eh_globals {
    __cxa_exception * caughtExceptions;
    unsigned int uncaughtExceptions;
};
}
#endif

#if !HAVE_CXXABI_H_CXA_GET_GLOBALS
namespace __cxxabiv1 {
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();
}
#endif

#if !HAVE_CXXABI_H_CXA_THROW
namespace __cxxabiv1 {
extern "C" void __cxa_throw(
    void * thrown_exception, void * tinfo, void (* dest)(void *))
    __attribute__((noreturn));
}
#endif

namespace abi_aarch64 {

void mapException(
    __cxa_exception * exception, std::type_info const * type, uno_Any * any, uno_Mapping * mapping);
    __cxxabiv1::__cxa_exception * exception, std::type_info const * type, uno_Any * any, uno_Mapping * mapping);

void raiseException(uno_Any * any, uno_Mapping * mapping);

diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx
index f03d848..0847dfc 100644
--- a/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx
@@ -24,8 +24,6 @@
#include <exception>
#include <typeinfo>

#include <cxxabi.h>

#include <bridge.hxx>
#include <types.hxx>
#include <unointerfaceproxy.hxx>
@@ -190,7 +188,7 @@ void call(
        }
    } catch (css::uno::Exception &) {
        abi_aarch64::mapException(
            reinterpret_cast<abi_aarch64::__cxa_eh_globals *>(
            reinterpret_cast<__cxxabiv1::__cxa_eh_globals *>(
                __cxxabiv1::__cxa_get_globals())->caughtExceptions,
            __cxxabiv1::__cxa_current_exception_type(), *exception,
            proxy->getBridge()->getCpp2Uno());