aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus Villemoes <rv@rasmusvillemoes.dk>2018-08-21 10:50:27 +0200
committerRasmus Villemoes <villemoes@gcc.gnu.org>2018-08-21 08:50:27 +0000
commitace193dc4773159a2c545ab6ca80842c56019e3a (patch)
treefc20d372cc962ea6382184e80aa1fcac7b03a9ff
parent9a5b8df7007b350015509ee8f809fd7d2c8fa963 (diff)
downloadgcc-ace193dc4773159a2c545ab6ca80842c56019e3a.zip
gcc-ace193dc4773159a2c545ab6ca80842c56019e3a.tar.gz
gcc-ace193dc4773159a2c545ab6ca80842c56019e3a.tar.bz2
vxworks: enable use of .init_array/.fini_array for cdtors
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/vxworks.c7
-rw-r--r--gcc/config/vxworks.h10
3 files changed, 19 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index da16c90..609965b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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
default search path for VxWorks < 7.
diff --git a/gcc/config/vxworks.c b/gcc/config/vxworks.c
index 061f020..953f74f71 100644
--- a/gcc/config/vxworks.c
+++ b/gcc/config/vxworks.c
@@ -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)
diff --git a/gcc/config/vxworks.h b/gcc/config/vxworks.h
index 08d2c9d..4c2d983 100644
--- a/gcc/config/vxworks.h
+++ b/gcc/config/vxworks.h
@@ -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. */