vxworks.h (VXWORKS_LIB_SPEC): Incorporate ...
authorJerome Lambourg <lambourg@adacore.com>
Tue, 27 Jun 2017 09:15:55 +0000 (09:15 +0000)
committerOlivier Hainque <hainque@gcc.gnu.org>
Tue, 27 Jun 2017 09:15:55 +0000 (09:15 +0000)
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.

Co-Authored-By: Olivier Hainque <hainque@adacore.com>
From-SVN: r249684

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

index 36773196eec6a4a6feaaeca900cf1451234eebb8..2da6160a0b59f59b9e758cf3cb2685375a3d1aa1 100644 (file)
@@ -1,3 +1,15 @@
+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
index 8f1c78d5207939bd0b53dcca1bb3552f652e303f..944cc1d239b6ad9e9305351cdb172a1100626bf0 100644 (file)
@@ -125,20 +125,24 @@ vxworks_emutls_var_init (tree var, tree decl, tree tmpl_addr)
 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;
 
index 9afd332e0144aa410f7c47f480454f11c6075ecf..e78ea280050d16844149a10e6576d56c7dbfbc50 100644 (file)
@@ -81,16 +81,22 @@ along with GCC; see the file COPYING3.  If not see
    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 "}"
 
@@ -126,6 +132,9 @@ along with GCC; see the file COPYING3.  If not see
 #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);