[PATCH] libdl: Refactor shared code in Arm and AArch64
Chris Johns
chrisj at rtems.org
Fri Jul 29 00:30:39 UTC 2022
OK
Nice change and clean up.
Thanks
Chris
On 29/7/2022 1:04 am, Ryan Long wrote:
> rtl-mdreloc-arm.c was used as the basis for rtl-mdreloc-aarch64.c. This lead
> to some code being shared by the two files. The code was consolidated into
> rtl-unwind-arm.c.
>
> Closes #4686
> ---
> cpukit/libdl/rtl-mdreloc-aarch64.c | 79 +-----------------------------
> cpukit/libdl/rtl-mdreloc-arm.c | 79 +-----------------------------
> cpukit/libdl/rtl-unwind-arm.c | 69 ++++++++++++++++++++++++++
> cpukit/libdl/rtl-unwind-arm.h | 46 +++++++++++++++++
> spec/build/cpukit/objdlaarch64.yml | 1 +
> spec/build/cpukit/objdlarm.yml | 1 +
> 6 files changed, 119 insertions(+), 156 deletions(-)
> create mode 100644 cpukit/libdl/rtl-unwind-arm.c
> create mode 100644 cpukit/libdl/rtl-unwind-arm.h
>
> diff --git a/cpukit/libdl/rtl-mdreloc-aarch64.c b/cpukit/libdl/rtl-mdreloc-aarch64.c
> index 3b1bbff2d2..738c9eba70 100644
> --- a/cpukit/libdl/rtl-mdreloc-aarch64.c
> +++ b/cpukit/libdl/rtl-mdreloc-aarch64.c
> @@ -73,16 +73,12 @@ __RCSID("$NetBSD: mdreloc.c,v 1.14 2020/06/16 21:01:30 joerg Exp $");
> #include <inttypes.h>
> #include <sys/stat.h>
> #include <sys/endian.h>
> -#include <unwind.h>
>
> #include <rtems/rtl/rtl.h>
> #include "rtl-elf.h"
> #include "rtl-error.h"
> #include <rtems/rtl/rtl-trace.h>
> -#include "rtl-unwind.h"
> -
> -typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
> -typedef _Unwind_Word _uw;
> +#include "rtl-unwind-arm.h"
>
> struct tls_data {
> size_t td_tlsindex;
> @@ -523,76 +519,3 @@ rtems_rtl_elf_relocate_rel (rtems_rtl_obj* obj,
> return rtems_rtl_elf_rel_failure;
> }
>
> -bool
> -rtems_rtl_elf_unwind_parse (const rtems_rtl_obj* obj,
> - const char* name,
> - uint32_t flags)
> -{
> - /*
> - * We location the EH sections in section flags.
> - */
> - return false;
> -}
> -
> -bool
> -rtems_rtl_elf_unwind_register (rtems_rtl_obj* obj)
> -{
> - return true;
> -}
> -
> -bool
> -rtems_rtl_elf_unwind_deregister (rtems_rtl_obj* obj)
> -{
> - return true;
> -}
> -
> -/* An exception index table entry. */
> -typedef struct __EIT_entry
> -{
> - _uw fnoffset;
> - _uw content;
> -} __EIT_entry;
> -
> -/* The exception index table location in the base module */
> -extern __EIT_entry __exidx_start;
> -extern __EIT_entry __exidx_end;
> -
> -/*
> - * A weak reference is in libgcc, provide a real version and provide a way to
> - * manage loaded modules.
> - *
> - * Passed in the return address and a reference to the number of records
> - * found. We set the start of the exidx data and the number of records.
> - */
> -_Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> - int* nrec) __attribute__ ((__noinline__,
> - __used__,
> - __noclone__));
> -
> -_Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> - int* nrec)
> -{
> - rtems_rtl_data* rtl;
> - rtems_chain_node* node;
> - __EIT_entry* exidx_start = &__exidx_start;
> - __EIT_entry* exidx_end = &__exidx_end;
> -
> - rtl = rtems_rtl_lock ();
> -
> - node = rtems_chain_first (&rtl->objects);
> - while (!rtems_chain_is_tail (&rtl->objects, node)) {
> - rtems_rtl_obj* obj = (rtems_rtl_obj*) node;
> - if (rtems_rtl_obj_text_inside (obj, (void*) return_address)) {
> - exidx_start = (__EIT_entry*) obj->eh_base;
> - exidx_end = (__EIT_entry*) (obj->eh_base + obj->eh_size);
> - break;
> - }
> - node = rtems_chain_next (node);
> - }
> -
> - rtems_rtl_unlock ();
> -
> - *nrec = exidx_end - exidx_start;
> -
> - return (_Unwind_Ptr) exidx_start;
> -}
> diff --git a/cpukit/libdl/rtl-mdreloc-arm.c b/cpukit/libdl/rtl-mdreloc-arm.c
> index 4950dcdab1..fbfd42dc58 100644
> --- a/cpukit/libdl/rtl-mdreloc-arm.c
> +++ b/cpukit/libdl/rtl-mdreloc-arm.c
> @@ -12,14 +12,12 @@
> #include <string.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> -#include <unwind.h>
> -#include <unwind-arm-common.h>
>
> #include <rtems/rtl/rtl.h>
> #include "rtl-elf.h"
> #include "rtl-error.h"
> #include <rtems/rtl/rtl-trace.h>
> -#include "rtl-unwind.h"
> +#include "rtl-unwind-arm.h"
>
> /*
> * Set to 1 to allow untested relocations. If you tested one and it
> @@ -597,78 +595,3 @@ rtems_rtl_elf_relocate_rel (rtems_rtl_obj* obj,
> symvalue,
> false);
> }
> -
> -bool
> -rtems_rtl_elf_unwind_parse (const rtems_rtl_obj* obj,
> - const char* name,
> - uint32_t flags)
> -{
> - /*
> - * We location the EH sections in section flags.
> - */
> - return false;
> -}
> -
> -bool
> -rtems_rtl_elf_unwind_register (rtems_rtl_obj* obj)
> -{
> - return true;
> -}
> -
> -bool
> -rtems_rtl_elf_unwind_deregister (rtems_rtl_obj* obj)
> -{
> - obj->loader = NULL;
> - return true;
> -}
> -
> -/* An exception index table entry. */
> -typedef struct __EIT_entry
> -{
> - _uw fnoffset;
> - _uw content;
> -} __EIT_entry;
> -
> -/* The exception index table location in the base module */
> -extern __EIT_entry __exidx_start;
> -extern __EIT_entry __exidx_end;
> -
> -/*
> - * A weak reference is in libgcc, provide a real version and provide a way to
> - * manage loaded modules.
> - *
> - * Passed in the return address and a reference to the number of records
> - * found. We set the start of the exidx data and the number of records.
> - */
> -_Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> - int* nrec) __attribute__ ((__noinline__,
> - __used__,
> - __noclone__));
> -
> -_Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> - int* nrec)
> -{
> - rtems_rtl_data* rtl;
> - rtems_chain_node* node;
> - __EIT_entry* exidx_start = &__exidx_start;
> - __EIT_entry* exidx_end = &__exidx_end;
> -
> - rtl = rtems_rtl_lock ();
> -
> - node = rtems_chain_first (&rtl->objects);
> - while (!rtems_chain_is_tail (&rtl->objects, node)) {
> - rtems_rtl_obj* obj = (rtems_rtl_obj*) node;
> - if (rtems_rtl_obj_text_inside (obj, (void*) return_address)) {
> - exidx_start = (__EIT_entry*) obj->eh_base;
> - exidx_end = (__EIT_entry*) (obj->eh_base + obj->eh_size);
> - break;
> - }
> - node = rtems_chain_next (node);
> - }
> -
> - rtems_rtl_unlock ();
> -
> - *nrec = exidx_end - exidx_start;
> -
> - return (_Unwind_Ptr) exidx_start;
> -}
> diff --git a/cpukit/libdl/rtl-unwind-arm.c b/cpukit/libdl/rtl-unwind-arm.c
> new file mode 100644
> index 0000000000..a496fb3793
> --- /dev/null
> +++ b/cpukit/libdl/rtl-unwind-arm.c
> @@ -0,0 +1,69 @@
> +#include "rtl-unwind-arm.h"
> +
> +bool
> +rtems_rtl_elf_unwind_parse (const rtems_rtl_obj* obj,
> + const char* name,
> + uint32_t flags)
> +{
> + /*
> + * We location the EH sections in section flags.
> + */
> + return false;
> +}
> +
> +bool
> +rtems_rtl_elf_unwind_register (rtems_rtl_obj* obj)
> +{
> + return true;
> +}
> +
> +bool
> +rtems_rtl_elf_unwind_deregister (rtems_rtl_obj* obj)
> +{
> + return true;
> +}
> +
> +/* The exception index table location in the base module */
> +extern __EIT_entry __exidx_start;
> +extern __EIT_entry __exidx_end;
> +
> +/*
> + * A weak reference is in libgcc, provide a real version and provide a way to
> + * manage loaded modules.
> + *
> + * Passed in the return address and a reference to the number of records
> + * found. We set the start of the exidx data and the number of records.
> + */
> +_Unwind_Ptr
> +__gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> + int* nrec) __attribute__ ((__noinline__,
> + __used__,
> + __noclone__));
> +
> +_Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> + int* nrec)
> +{
> + rtems_rtl_data* rtl;
> + rtems_chain_node* node;
> + __EIT_entry* exidx_start = &__exidx_start;
> + __EIT_entry* exidx_end = &__exidx_end;
> +
> + rtl = rtems_rtl_lock ();
> +
> + node = rtems_chain_first (&rtl->objects);
> + while (!rtems_chain_is_tail (&rtl->objects, node)) {
> + rtems_rtl_obj* obj = (rtems_rtl_obj*) node;
> + if (rtems_rtl_obj_text_inside (obj, (void*) return_address)) {
> + exidx_start = (__EIT_entry*) obj->eh_base;
> + exidx_end = (__EIT_entry*) (obj->eh_base + obj->eh_size);
> + break;
> + }
> + node = rtems_chain_next (node);
> + }
> +
> + rtems_rtl_unlock ();
> +
> + *nrec = exidx_end - exidx_start;
> +
> + return (_Unwind_Ptr) exidx_start;
> +}
> diff --git a/cpukit/libdl/rtl-unwind-arm.h b/cpukit/libdl/rtl-unwind-arm.h
> new file mode 100644
> index 0000000000..08a2660560
> --- /dev/null
> +++ b/cpukit/libdl/rtl-unwind-arm.h
> @@ -0,0 +1,46 @@
> +#include <unwind.h>
> +
> +#include <rtems/rtl/rtl.h>
> +#include "rtl-unwind.h"
> +
> +typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
> +typedef _Unwind_Word _uw;
> +
> +bool
> +rtems_rtl_elf_unwind_parse (const rtems_rtl_obj* obj,
> + const char* name,
> + uint32_t flags);
> +
> +bool
> +rtems_rtl_elf_unwind_register (rtems_rtl_obj* obj);
> +
> +bool
> +rtems_rtl_elf_unwind_deregister (rtems_rtl_obj* obj);
> +
> +/* An exception index table entry. */
> +typedef struct __EIT_entry
> +{
> + _uw fnoffset;
> + _uw content;
> +} __EIT_entry;
> +
> +/* The exception index table location in the base module */
> +extern __EIT_entry __exidx_start;
> +extern __EIT_entry __exidx_end;
> +
> +/*
> + * A weak reference is in libgcc, provide a real version and provide a way to
> + * manage loaded modules.
> + *
> + * Passed in the return address and a reference to the number of records
> + * found. We set the start of the exidx data and the number of records.
> + */
> +_Unwind_Ptr
> +__gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> + int* nrec) __attribute__ ((__noinline__,
> + __used__,
> + __noclone__));
> +
> +_Unwind_Ptr
> +__gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
> + int* nrec);
> diff --git a/spec/build/cpukit/objdlaarch64.yml b/spec/build/cpukit/objdlaarch64.yml
> index 2909a902f2..1715eefd3a 100644
> --- a/spec/build/cpukit/objdlaarch64.yml
> +++ b/spec/build/cpukit/objdlaarch64.yml
> @@ -12,4 +12,5 @@ install: []
> links: []
> source:
> - cpukit/libdl/rtl-mdreloc-aarch64.c
> +- cpukit/libdl/rtl-unwind-arm.c
> type: build
> diff --git a/spec/build/cpukit/objdlarm.yml b/spec/build/cpukit/objdlarm.yml
> index 6edb3653f2..f3e1d37668 100644
> --- a/spec/build/cpukit/objdlarm.yml
> +++ b/spec/build/cpukit/objdlarm.yml
> @@ -12,4 +12,5 @@ install: []
> links: []
> source:
> - cpukit/libdl/rtl-mdreloc-arm.c
> +- cpukit/libdl/rtl-unwind-arm.c
> type: build
More information about the devel
mailing list