From 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Mon, 29 Jun 2020 14:35:08 -0500 Subject: score: Add CPU_USE_LIBC_INIT_FINI_ARRAY This introduces the CPU_USE_LIBC_INIT_FINI_ARRAY define for use by CPU ports to determine which global constructor and destructor methods are used instead of placing architecture defines where they shouldn't be. Close #4018 --- cpukit/libcsupport/src/newlibc_exit.c | 5 +---- cpukit/score/cpu/arm/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/bfin/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/epiphany/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/i386/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/lm32/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/m68k/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/mips/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/moxie/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/nios2/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h | 7 +++++++ cpukit/score/cpu/or1k/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/powerpc/include/rtems/score/cpu.h | 3 +++ cpukit/score/cpu/riscv/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/sh/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/sparc/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/sparc64/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/v850/include/rtems/score/cpu.h | 2 ++ cpukit/score/cpu/x86_64/include/rtems/score/cpu.h | 2 ++ cpukit/score/src/threadhandler.c | 8 ++++++-- 20 files changed, 49 insertions(+), 6 deletions(-) diff --git a/cpukit/libcsupport/src/newlibc_exit.c b/cpukit/libcsupport/src/newlibc_exit.c index 650b692c74..d29214af3f 100644 --- a/cpukit/libcsupport/src/newlibc_exit.c +++ b/cpukit/libcsupport/src/newlibc_exit.c @@ -17,11 +17,8 @@ #include #include -/* FIXME: These defines are a blatant hack */ - #if defined(__USE_INIT_FINI__) - #if defined(__ARM_EABI__) || defined(__riscv) \ - || defined(__or1k__) || defined(__or1knd__) + #if CPU_USE_LIBC_INIT_FINI_ARRAY == TRUE #define FINI_SYMBOL __libc_fini_array #else #define FINI_SYMBOL _fini diff --git a/cpukit/score/cpu/arm/include/rtems/score/cpu.h b/cpukit/score/cpu/arm/include/rtems/score/cpu.h index b7b48a3ac3..b90fb1f394 100644 --- a/cpukit/score/cpu/arm/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/arm/include/rtems/score/cpu.h @@ -153,6 +153,8 @@ #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE + #define CPU_MAXIMUM_PROCESSORS 32 #ifdef ARM_MULTILIB_HAS_THREAD_ID_REGISTER diff --git a/cpukit/score/cpu/bfin/include/rtems/score/cpu.h b/cpukit/score/cpu/bfin/include/rtems/score/cpu.h index 893a3ae359..3b0f0bece3 100644 --- a/cpukit/score/cpu/bfin/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/bfin/include/rtems/score/cpu.h @@ -507,6 +507,8 @@ void _CPU_Context_Initialize( #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* functions */ /** diff --git a/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h b/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h index 462ffab040..70a9790606 100644 --- a/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h @@ -445,6 +445,8 @@ void _CPU_Context_Initialize( #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + #endif /* ASM */ /** diff --git a/cpukit/score/cpu/i386/include/rtems/score/cpu.h b/cpukit/score/cpu/i386/include/rtems/score/cpu.h index 0145ff8db3..225b72802d 100644 --- a/cpukit/score/cpu/i386/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/i386/include/rtems/score/cpu.h @@ -503,6 +503,8 @@ extern void _CPU_Fatal_halt(uint32_t source, uint32_t error) /* end of Fatal Error manager macros */ +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* * Bitfield handler macros * diff --git a/cpukit/score/cpu/lm32/include/rtems/score/cpu.h b/cpukit/score/cpu/lm32/include/rtems/score/cpu.h index 13f8f36194..8e702992c1 100644 --- a/cpukit/score/cpu/lm32/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/lm32/include/rtems/score/cpu.h @@ -628,6 +628,8 @@ extern char _gp[]; #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* functions */ /** diff --git a/cpukit/score/cpu/m68k/include/rtems/score/cpu.h b/cpukit/score/cpu/m68k/include/rtems/score/cpu.h index de085c9f7d..777fbfeb30 100644 --- a/cpukit/score/cpu/m68k/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/m68k/include/rtems/score/cpu.h @@ -433,6 +433,8 @@ void *_CPU_Thread_Idle_body( uintptr_t ignored ); /* end of Fatal Error manager macros */ +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* * Bitfield handler macros * diff --git a/cpukit/score/cpu/mips/include/rtems/score/cpu.h b/cpukit/score/cpu/mips/include/rtems/score/cpu.h index c9c212eab5..2b662cd549 100644 --- a/cpukit/score/cpu/mips/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/mips/include/rtems/score/cpu.h @@ -740,6 +740,8 @@ extern void mips_break( int error ); #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* functions */ /* diff --git a/cpukit/score/cpu/moxie/include/rtems/score/cpu.h b/cpukit/score/cpu/moxie/include/rtems/score/cpu.h index 318650ea3f..c47e414f92 100644 --- a/cpukit/score/cpu/moxie/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/moxie/include/rtems/score/cpu.h @@ -427,6 +427,8 @@ uint32_t _CPU_ISR_Get_level( void ); #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* functions */ /* diff --git a/cpukit/score/cpu/nios2/include/rtems/score/cpu.h b/cpukit/score/cpu/nios2/include/rtems/score/cpu.h index d98b0c5c35..5528561d1c 100644 --- a/cpukit/score/cpu/nios2/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/nios2/include/rtems/score/cpu.h @@ -90,6 +90,8 @@ extern "C" { #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0 #define CPU_MAXIMUM_PROCESSORS 32 diff --git a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h index 7f6e1f539d..84125aa16b 100644 --- a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h @@ -249,6 +249,13 @@ extern "C" { */ #define CPU_MAXIMUM_PROCESSORS 32 +/** + * The following define determines whether or not this CPU port will use + * libc global constructors and destructors instead of _init/_fini functions + * depending on .ctors and .dtors linker sections. + */ +#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE + /* * Processor defined structures required for cpukit/score. * diff --git a/cpukit/score/cpu/or1k/include/rtems/score/cpu.h b/cpukit/score/cpu/or1k/include/rtems/score/cpu.h index 39920bebc3..6790694b05 100644 --- a/cpukit/score/cpu/or1k/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/or1k/include/rtems/score/cpu.h @@ -435,6 +435,8 @@ void _CPU_Context_Initialize( #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE + #endif /* ASM */ #define CPU_SIZEOF_POINTER 4 diff --git a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h index 8e4b10156f..33d8755ba4 100644 --- a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h @@ -805,6 +805,9 @@ void _CPU_Context_Initialize( #endif /* ASM */ #ifndef ASM + +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* Bitfield handler macros */ #define CPU_USE_GENERIC_BITFIELD_CODE FALSE diff --git a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h index e08307d372..501973a6dc 100644 --- a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h @@ -219,6 +219,8 @@ extern void _CPU_Fatal_halt(uint32_t source, uint32_t error) RTEMS_NO_RETURN; #define CPU_USE_GENERIC_BITFIELD_DATA TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE + #define CPU_MAXIMUM_PROCESSORS 32 typedef uint16_t Priority_bit_map_Word; diff --git a/cpukit/score/cpu/sh/include/rtems/score/cpu.h b/cpukit/score/cpu/sh/include/rtems/score/cpu.h index a7cd5f89fd..9264479153 100644 --- a/cpukit/score/cpu/sh/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/sh/include/rtems/score/cpu.h @@ -535,6 +535,8 @@ void _CPU_Context_Initialize( #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* functions */ /* diff --git a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h index d4b24f3f56..13782f2f12 100644 --- a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h @@ -917,6 +917,8 @@ extern void _CPU_Fatal_halt(uint32_t source, uint32_t error) /* end of Fatal Error manager macros */ +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* Bitfield handler macros */ #if ( SPARC_HAS_BITSCAN == 0 ) diff --git a/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h b/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h index 84cb5865bd..2dd5cb194f 100644 --- a/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h @@ -801,6 +801,8 @@ void _CPU_Context_Initialize( /* end of Fatal Error manager macros */ +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* Bitfield handler macros */ /* diff --git a/cpukit/score/cpu/v850/include/rtems/score/cpu.h b/cpukit/score/cpu/v850/include/rtems/score/cpu.h index 0ab1d68ba7..a538789a58 100644 --- a/cpukit/score/cpu/v850/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/v850/include/rtems/score/cpu.h @@ -493,6 +493,8 @@ void _CPU_Context_Initialize( #define CPU_USE_GENERIC_BITFIELD_CODE TRUE +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* functions */ /** diff --git a/cpukit/score/cpu/x86_64/include/rtems/score/cpu.h b/cpukit/score/cpu/x86_64/include/rtems/score/cpu.h index e3da0aa524..12ae14e229 100644 --- a/cpukit/score/cpu/x86_64/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/x86_64/include/rtems/score/cpu.h @@ -242,6 +242,8 @@ void _CPU_Context_Initialize( /* end of Fatal Error manager macros */ +#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE + /* Bitfield handler macros */ #define CPU_USE_GENERIC_BITFIELD_CODE TRUE diff --git a/cpukit/score/src/threadhandler.c b/cpukit/score/src/threadhandler.c index acbe186a53..6742b0b391 100644 --- a/cpukit/score/src/threadhandler.c +++ b/cpukit/score/src/threadhandler.c @@ -28,9 +28,13 @@ * Conditional magic to determine what style of C++ constructor * initialization this target and compiler version uses. */ +RTEMS_STATIC_ASSERT( + CPU_USE_LIBC_INIT_FINI_ARRAY == TRUE + || CPU_USE_LIBC_INIT_FINI_ARRAY == FALSE, + CPU_USE_LIBC_INIT_FINI_ARRAY +); #if defined(__USE_INIT_FINI__) - #if defined(__ARM_EABI__) || defined(__riscv) \ - || defined(__or1k__) || defined(__or1knd__) + #if CPU_USE_LIBC_INIT_FINI_ARRAY == TRUE #define INIT_NAME __libc_init_array #else #define INIT_NAME _init -- cgit v1.2.3