[ARM/FDPIC v6 06/24] [ARM] FDPIC: Add support for c++ exceptions
authorChristophe Lyon <christophe.lyon@st.com>
Tue, 10 Sep 2019 07:47:49 +0000 (09:47 +0200)
committerChristophe Lyon <clyon@gcc.gnu.org>
Tue, 10 Sep 2019 07:47:49 +0000 (09:47 +0200)
commit5d727a4b20257275df59182b00f3bf240772cd0d
tree5fa39e7a145e9c36ae2c34ec78e3360e97f99b56
parent11189793b6ef60645d5d1126d0bd9d0dd83e6583
[ARM/FDPIC v6 06/24] [ARM] FDPIC: Add support for c++ exceptions

The main difference with existing support is that function addresses
are function descriptor addresses instead. This means that all code
dealing with function pointers now has to cope with function
descriptors instead.

For the same reason, Linux kernel helpers can no longer be called by
dereferencing their address, so we implement wrappers that directly
call the kernel helpers.

When restoring a function address, we also have to restore the FDPIC
register value (r9).

2019-09-10  Christophe Lyon  <christophe.lyon@st.com>
Mickaël Guêné <mickael.guene@st.com>

gcc/
* ginclude/unwind-arm-common.h (unwinder_cache): Add reserved5
field.

libgcc/
* config/arm/linux-atomic.c (__kernel_cmpxchg): Add FDPIC support.
(__kernel_dmb): Likewise.
(__fdpic_cmpxchg): New function.
(__fdpic_dmb): New function.
* config/arm/unwind-arm.h (FDPIC_REGNUM): New define.
(gnu_Unwind_Find_got): New function.
(_Unwind_decode_typeinfo_ptr): Add FDPIC support.
* unwind-arm-common.inc (UCB_PR_GOT): New.
(funcdesc_t): New struct.
(get_eit_entry): Add FDPIC support.
(unwind_phase2): Likewise.
(unwind_phase2_forced): Likewise.
(__gnu_Unwind_RaiseException): Likewise.
(__gnu_Unwind_Resume): Likewise.
(__gnu_Unwind_Backtrace): Likewise.
* unwind-pe.h (read_encoded_value_with_base): Likewise.

libstdc++/
* libsupc++/eh_personality.cc (get_ttype_entry): Add FDPIC
support.

Co-Authored-By: Mickaël Guêné <mickael.guene@st.com>
From-SVN: r275568
gcc/ChangeLog
gcc/ginclude/unwind-arm-common.h
libgcc/ChangeLog
libgcc/config/arm/linux-atomic.c
libgcc/config/arm/unwind-arm.h
libgcc/unwind-arm-common.inc
libgcc/unwind-pe.h
libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/eh_personality.cc