+2017-06-27 Jerome Lambourg <lambourg@adacore.com>
+ Olivier Hainque <hainque@adacore.com>
+
+ * config/vxworks.h (VXWORKS_LIB_SPEC): Incorporate ...
+ (TLS_SYM): New local macro, forcing reference to __tls__ on
+ link command lines for VxWorks 7 RTPs, triggering initialization
+ of tlsLib.
+ (VXWORKS_HAVE_TLS): New macro. State whether the target VxWorks
+ OS features TLS support, true for RTPs on VxWorks 7.
+ * config/vxworks.c (vxworks_override_options): Setup emutls
+ accordingly.
+
2017-06-27 Jakub Jelinek <jakub@redhat.com>
* predict.c (test_prediction_value_range): Use -1U instead of -1
void
vxworks_override_options (void)
{
- /* We don't support __thread via target hooks. */
- targetm.have_tls = false;
-
- targetm.emutls.get_address = "__builtin___tls_lookup";
- targetm.emutls.register_common = NULL;
- targetm.emutls.var_section = ".tls_vars";
- targetm.emutls.tmpl_section = ".tls_data";
- targetm.emutls.var_prefix = "__tls__";
- targetm.emutls.tmpl_prefix = "";
- targetm.emutls.var_fields = vxworks_emutls_var_fields;
- targetm.emutls.var_init = vxworks_emutls_var_init;
- targetm.emutls.var_align_fixed = true;
- targetm.emutls.debug_form_tls_address = true;
-
+ /* Setup the tls emulation bits if the OS misses proper
+ tls support. */
+ targetm.have_tls = VXWORKS_HAVE_TLS;
+
+ if (!VXWORKS_HAVE_TLS)
+ {
+ targetm.emutls.get_address = "__builtin___tls_lookup";
+ targetm.emutls.register_common = NULL;
+ targetm.emutls.var_section = ".tls_vars";
+ targetm.emutls.tmpl_section = ".tls_data";
+ targetm.emutls.var_prefix = "__tls__";
+ targetm.emutls.tmpl_prefix = "";
+ targetm.emutls.var_fields = vxworks_emutls_var_fields;
+ targetm.emutls.var_init = vxworks_emutls_var_init;
+ targetm.emutls.var_align_fixed = true;
+ targetm.emutls.debug_form_tls_address = true;
+ }
+
/* We can use .ctors/.dtors sections only in RTP mode. */
targetm.have_ctors_dtors = TARGET_VXWORKS_RTP;
and its structure is fixed and does not depend on the arch. We can thus
tell gcc where to look for when linking with RTP libraries. */
+/* On Vx7 RTP, we need to drag the __tls__ symbol to trigger initialization of
+ tlsLib, responsible for TLS support by the OS. */
+
#if TARGET_VXWORKS7
#define VXWORKS_LIBS_DIR_RTP "-L%:getenv(VSB_DIR /usr/lib/common)"
+#define TLS_SYM "-u __tls__"
#else
#define VXWORKS_LIBS_DIR_RTP ""
+#define TLS_SYM ""
#endif
#undef VXWORKS_LIB_SPEC
#define VXWORKS_LIB_SPEC \
"%{mrtp:%{shared:-u " USER_LABEL_PREFIX "__init -u " USER_LABEL_PREFIX "__fini} \
%{!shared:%{non-static:-u " USER_LABEL_PREFIX "_STI__6__rtld -ldl} \
+ " TLS_SYM " \
--start-group " VXWORKS_LIBS_RTP " --end-group} \
" VXWORKS_LIBS_DIR_RTP "}"
#define VXWORKS_ENDFILE_SPEC ""
/* Do VxWorks-specific parts of TARGET_OPTION_OVERRIDE. */
+
+#define VXWORKS_HAVE_TLS (TARGET_VXWORKS7 && TARGET_VXWORKS_RTP)
+
#undef VXWORKS_OVERRIDE_OPTIONS
#define VXWORKS_OVERRIDE_OPTIONS vxworks_override_options ()
extern void vxworks_override_options (void);