vxworks: enable use of .init_array/.fini_array for cdtors
authorRasmus Villemoes <rv@rasmusvillemoes.dk>
Tue, 21 Aug 2018 08:50:27 +0000 (10:50 +0200)
committerRasmus Villemoes <villemoes@gcc.gnu.org>
Tue, 21 Aug 2018 08:50:27 +0000 (08:50 +0000)
The target OS actually runs all function pointers found in the _ctors
array when the module is loaded. So it is not that hard to make use of
the "modern" .init_array/.fini_array mechanism - it mostly just requires
a linker script adding the _ctors and _dtors symbols and terminating
LONG(0) entries.

Assume that if the user passed --enable-initfini-array when building
gcc, the rest of the toolchain (including the link spec and linker
script) is set up appropriately.

Note that configuring with --enable-initfini-array may prevent the -mrtp
mode from working, due to the (unconditional) use of .init_array.*
sections instead of .ctors.* - however, that is the case regardless of this
patch.

From-SVN: r263691

gcc/ChangeLog
gcc/config/vxworks.c
gcc/config/vxworks.h

index da16c909681e4e6a679c941cca9aaa074bc6d8a1..609965bab9a2f57fea95646ddffae4d81f88bfc9 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-21  Rasmus Villemoes  <rv@rasmusvillemoes.dk>
+
+       * config/vxworks.c: Set targetm.have_ctors_dtors
+       if HAVE_INITFINI_ARRAY_SUPPORT.
+       * config/vxworks.h: Set SUPPORTS_INIT_PRIORITY
+       if HAVE_INITFINI_ARRAY_SUPPORT.
+
 2018-08-21  Rasmus Villemoes  <rv@rasmusvillemoes.dk>
 
        * config/vxworks.h: Add $(WIND_BASE)/target/h/wrn/coreip to
index 061f02057c228444ae161d891ffe3db3c888940a..953f74f71af8618ef38726a61273abd2ddc338ea 100644 (file)
@@ -143,8 +143,11 @@ vxworks_override_options (void)
       targetm.emutls.debug_form_tls_address = true;
     }
 
-  /* We can use .ctors/.dtors sections only in RTP mode.  */
-  targetm.have_ctors_dtors = TARGET_VXWORKS_RTP;
+  /* We can use .ctors/.dtors sections only in RTP mode.  But, if the
+     compiler was built with --enable-initfini-array, assume the
+     toolchain implements the proper glue to make .init_array and
+     .fini_array work.  */
+  targetm.have_ctors_dtors = TARGET_VXWORKS_RTP || HAVE_INITFINI_ARRAY_SUPPORT;
 
   /* PIC is only supported for RTPs.  */
   if (flag_pic && !TARGET_VXWORKS_RTP)
index 08d2c9d76d69860f42907e3ae3c37460370d1322..4c2d98381f66dee8144aed0d8603c56d848878a6 100644 (file)
@@ -142,9 +142,13 @@ along with GCC; see the file COPYING3.  If not see
 #define VXWORKS_OVERRIDE_OPTIONS vxworks_override_options ()
 extern void vxworks_override_options (void);
 
-/* Only RTPs support prioritized constructors and destructors:
-   the implementation relies on numbered .ctors* sections.  */
-#define SUPPORTS_INIT_PRIORITY TARGET_VXWORKS_RTP
+/* RTPs support prioritized constructors and destructors: the
+   implementation relies on numbered .ctors* sections. If the compiler
+   was built with --enable-initfini-array, we assume the user uses a
+   linker script that sorts and merges the .init_array.* sections
+   appropriately.  */
+#define SUPPORTS_INIT_PRIORITY \
+  (TARGET_VXWORKS_RTP || HAVE_INITFINI_ARRAY_SUPPORT)
 
 /* VxWorks requires special handling of constructors and destructors.
    All VxWorks configurations must use these functions.  */