From c6eead1353e03542e5bad9efda3b6553125520d8 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Wed, 7 Dec 2016 17:20:38 +1100 Subject: libdl: Add C++ exception support to loaded modules. This has been tested on SPARC, i386, PowerPC and ARM. Closes #2767. --- cpukit/libdl/rtl-unwind-dw2.h | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 cpukit/libdl/rtl-unwind-dw2.h (limited to 'cpukit/libdl/rtl-unwind-dw2.h') diff --git a/cpukit/libdl/rtl-unwind-dw2.h b/cpukit/libdl/rtl-unwind-dw2.h new file mode 100644 index 0000000000..55b97970c2 --- /dev/null +++ b/cpukit/libdl/rtl-unwind-dw2.h @@ -0,0 +1,83 @@ +/* + * COPYRIGHT (c) 2016 Chris Johns + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ +/** + * @file + * + * @ingroup rtems_rtl + * + * @brief RTEMS Run-Time Linker Unwind DWARF Support. + */ + +#if !defined (_RTEMS_RTL_UNWIND_DW2_H_) +#define _RTEMS_RTL_UNWIND_DW2_H_ + +#include "rtl-elf.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if __SIZEOF_LONG__ >= __SIZEOF_POINTER__ + typedef long rtems_rtl_elf_unwind_dw2_sleb128; + typedef unsigned long rtems_rtl_elf_unwind_dw2_uleb128; +#elif __SIZEOF_LONG_LONG__ >= __SIZEOF_POINTER__ + typedef long long rtems_rtl_elf_unwind_dw2_sleb128; + typedef unsigned long long rtems_rtl_elf_unwind_dw2_uleb128; +#else + #error No DW2 type available. +#endif + +/** + * Architecture specific handler to check if a section contains exception + * handler data.. + * + * @param obj The object file. + * @param name The section's name. + * @param uint32 flags The object file's flags. + * @retval true The section contains unwind information. + * @retval false The section does not contain unwind information. + */ +bool rtems_rtl_elf_unwind_dw2_parse (const rtems_rtl_obj_t* obj, + const char* name, + uint32_t flags); + +/** + * Architecture specific handler to add an object file's unwind information to + * the base image. + * + * @param obj The object file. + * @retval true The unwind information has been registered. + * @retval false The unwind information could not be registered. + */ +bool rtems_rtl_elf_unwind_dw2_register (const rtems_rtl_obj_t* obj); + +/** + * Architecture specific handler to remove an object file's unwind information + * from the base image. + * + * @param obj The object file. + * @retval true The unwind information has been deregistered. + * @retval false The unwind information could not be deregistered. + */ +bool rtems_rtl_elf_unwind_dw2_deregister (const rtems_rtl_obj_t* obj); + +/** + * Read signed and unsigned LEB128 values. + */ +const uint8_t* rtems_rtl_elf_unwind_dw2_read_uleb128 (const uint8_t* data, + rtems_rtl_elf_unwind_dw2_uleb128* val); +const uint8_t* rtems_rtl_elf_unwind_dw2_read_sleb128 (const uint8_t* data, + rtems_rtl_elf_unwind_dw2_sleb128* val); + +bool rtems_rtl_elf_unwind_dw2_relocate (const Elf_Addr* where, Elf_Word value, Elf_Word mask); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif -- cgit v1.2.3