]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Revert emutls patch.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Oct 2006 16:27:14 +0000 (16:27 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Oct 2006 16:27:14 +0000 (16:27 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117578 138bc75d-0d04-0410-961f-82ee72b054a4

47 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/builtin-types.def
gcc/builtins.def
gcc/c-decl.c
gcc/c-parser.c
gcc/cgraph.c
gcc/cgraphunit.c
gcc/config/sparc/sol2.h
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/parser.c
gcc/dwarf2out.c
gcc/emutls.c
gcc/expr.c
gcc/fortran/ChangeLog
gcc/fortran/f95-lang.c
gcc/fortran/openmp.c
gcc/fortran/trans-common.c
gcc/fortran/trans-decl.c
gcc/fortran/types.def
gcc/libgcc-std.ver
gcc/output.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tls/alias-1.c
gcc/testsuite/gcc.dg/tls/asm-1.c
gcc/testsuite/gcc.dg/tls/debug-1.c
gcc/testsuite/gcc.dg/tls/diag-1.c
gcc/testsuite/gcc.dg/tls/diag-2.c
gcc/testsuite/gcc.dg/tls/diag-3.c
gcc/testsuite/gcc.dg/tls/diag-4.c
gcc/testsuite/gcc.dg/tls/diag-5.c
gcc/testsuite/gcc.dg/tls/init-1.c
gcc/testsuite/gcc.dg/tls/nonpic-1.c
gcc/testsuite/gcc.dg/tls/opt-10.c
gcc/testsuite/gcc.dg/tls/opt-5.c
gcc/testsuite/gcc.dg/tls/opt-6.c
gcc/testsuite/gcc.dg/tls/opt-8.c
gcc/testsuite/gcc.dg/tls/opt-9.c
gcc/testsuite/gcc.dg/tls/pic-1.c
gcc/testsuite/gcc.dg/tls/struct-1.c
gcc/testsuite/gcc.dg/tls/trivial.c
gcc/testsuite/lib/target-supports.exp
gcc/toplev.c
gcc/tree-ssa-address.c
gcc/tree.h
gcc/varasm.c

index 3ac5ae12b8a746085b06608399dd2266e9a0e8b2..d54a35880b2524d51efd718ac863443a532039bb 100644 (file)
@@ -1,3 +1,7 @@
+2006-10-09  Richard Henderson  <rth@redhat.com>
+
+       Revert emutls patch.
+
 2006-10-09  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/29254
index f06e464d6e3b2ed2223c26c547386fef615246ba..082d0f726a32df98a193e06b35dd21cc977d1660 100644 (file)
@@ -1422,9 +1422,9 @@ libgcc.mk: config.status Makefile mklibgcc $(LIB2ADD) $(LIB2ADD_ST) specs \
        LIBGCOV='$(LIBGCOV)' \
        LIB2ADD='$(LIB2ADD)' \
        LIB2ADD_ST='$(LIB2ADD_ST)' \
-       LIB2ADDEH='$(LIB2ADDEH) $(srcdir)/emutls.c' \
-       LIB2ADDEHSTATIC='$(LIB2ADDEHSTATIC) $(srcdir)/emutls.c' \
-       LIB2ADDEHSHARED='$(LIB2ADDEHSHARED) $(srcdir)/emutls.c' \
+       LIB2ADDEH='$(LIB2ADDEH)' \
+       LIB2ADDEHSTATIC='$(LIB2ADDEHSTATIC)' \
+       LIB2ADDEHSHARED='$(LIB2ADDEHSHARED)' \
        LIB2ADDEHDEP='$(LIB2ADDEHDEP)' \
        LIB2_SIDITI_CONV_FUNCS='$(LIB2_SIDITI_CONV_FUNCS)' \
        LIBUNWIND='$(LIBUNWIND)' \
@@ -1469,8 +1469,8 @@ LIBGCC_DEPS = $(GCC_PASSES) stmp-int-hdrs $(STMP_FIXPROTO) \
        $(MACHMODE_H) longlong.h gbl-ctors.h config.status $(srcdir)/libgcc2.h \
        tsystem.h $(FPBIT) $(DPBIT) $(TPBIT) $(LIB2ADD) \
        config/dfp-bit.h config/dfp-bit.c \
-       $(LIB2ADD_ST) $(LIB2ADDEH) $(srcdir)/emutls.c $(LIB2ADDEHDEP) \
-       $(EXTRA_PARTS) $(srcdir)/config/$(LIB1ASMSRC) \
+       $(LIB2ADD_ST) $(LIB2ADDEH) $(LIB2ADDEHDEP) $(EXTRA_PARTS) \
+       $(srcdir)/config/$(LIB1ASMSRC) \
        $(srcdir)/gcov-io.h $(srcdir)/gcov-io.c gcov-iov.h $(SFP_MACHINE)
 
 libgcov.a: libgcc.a; @true
index 0603596621809ffbb01184daa3b2f45ae2de525d..d6330b156525f9beea6a6cc2002487102d92ce89 100644 (file)
@@ -75,7 +75,7 @@ DEF_PRIMITIVE_TYPE (BT_LONGLONG, long_long_integer_type_node)
 DEF_PRIMITIVE_TYPE (BT_ULONGLONG, long_long_unsigned_type_node)
 DEF_PRIMITIVE_TYPE (BT_INTMAX, intmax_type_node)
 DEF_PRIMITIVE_TYPE (BT_UINTMAX, uintmax_type_node)
-DEF_PRIMITIVE_TYPE (BT_WORD, (*lang_hooks.types.type_for_mode) (word_mode, 1))
+DEF_PRIMITIVE_TYPE (BT_WORD, (*lang_hooks.types.type_for_mode) (word_mode, 0))
 DEF_PRIMITIVE_TYPE (BT_FLOAT, float_type_node)
 DEF_PRIMITIVE_TYPE (BT_DOUBLE, double_type_node)
 DEF_PRIMITIVE_TYPE (BT_LONGDOUBLE, long_double_type_node)
@@ -376,8 +376,6 @@ DEF_FUNCTION_TYPE_4 (BT_FN_INT_FILEPTR_INT_CONST_STRING_VALIST_ARG,
                     BT_INT, BT_FILEPTR, BT_INT, BT_CONST_STRING, BT_VALIST_ARG)
 DEF_FUNCTION_TYPE_4 (BT_FN_VOID_OMPFN_PTR_UINT_UINT,
                     BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_UINT, BT_UINT)
-DEF_FUNCTION_TYPE_4 (BT_FN_VOID_PTR_WORD_WORD_PTR,
-                    BT_VOID, BT_PTR, BT_WORD, BT_WORD, BT_PTR)
 
 DEF_FUNCTION_TYPE_5 (BT_FN_INT_STRING_INT_SIZE_CONST_STRING_VALIST_ARG,
                     BT_INT, BT_STRING, BT_INT, BT_SIZE, BT_CONST_STRING,
index 946db925f0b334b9301773db853af054aba5fc13..0e73cf440a40fb17e8e0f063c13d8624cf3b5022 100644 (file)
@@ -1,6 +1,6 @@
 /* This file contains the definitions and documentation for the
    builtins used in the GNU compiler.
-   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -723,10 +723,6 @@ DEF_EXT_LIB_BUILTIN    (BUILT_IN_VPRINTF_CHK, "__vprintf_chk", BT_FN_INT_INT_CON
 DEF_BUILTIN_STUB (BUILT_IN_PROFILE_FUNC_ENTER, "profile_func_enter")
 DEF_BUILTIN_STUB (BUILT_IN_PROFILE_FUNC_EXIT, "profile_func_exit")
 
-/* TLS emulation.  */
-DEF_EXT_LIB_BUILTIN (BUILT_IN_EMUTLS_GET_ADDRESS, "__emutls_get_address", BT_FN_PTR_PTR, ATTR_CONST_NOTHROW_NONNULL)
-DEF_EXT_LIB_BUILTIN (BUILT_IN_EMUTLS_REGISTER_COMMON, "__emutls_register_common", BT_FN_VOID_PTR_WORD_WORD_PTR, ATTR_NOTHROW_LIST)
-
 /* Synchronization Primitives.  */
 #include "sync-builtins.def"
 
index 6379a1e29740210e151e2fb1dfcdfd2efa0dd6db..3897bea36b6532b96e5e17ce99b5626b6a6ef44b 100644 (file)
@@ -4838,7 +4838,14 @@ grokdeclarator (const struct c_declarator *declarator,
          }
 
        if (threadp)
-         DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+         {
+           if (targetm.have_tls)
+             DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+           else
+             /* A mere warning is sure to result in improper semantics
+                at runtime.  Don't bother to allow this to compile.  */
+             error ("thread-local storage not supported for this target");
+         }
       }
 
     if (storage_class == csc_extern
index f4b08919700f3b75b17ed3996145a18efb91c287..852025392833ceb813663d00f0978fd16a8b96c1 100644 (file)
@@ -7801,6 +7801,9 @@ c_parser_omp_threadprivate (c_parser *parser)
   c_parser_consume_pragma (parser);
   vars = c_parser_omp_var_list_parens (parser, 0, NULL);
 
+  if (!targetm.have_tls)
+    sorry ("threadprivate variables not supported in this target");
+
   /* Mark every variable in VARS to be assigned thread local storage.  */
   for (t = vars; t; t = TREE_CHAIN (t))
     {
index 923683577841b50b6e51e691600438c7576971f9..3e5dab1f94eb789bb23aa63f2b534fa2d5a6b13f 100644 (file)
@@ -939,7 +939,7 @@ bool
 decide_is_variable_needed (struct cgraph_varpool_node *node, tree decl)
 {
   /* If the user told us it is used, then it must be so.  */
-  if (node->externally_visible || node->force_output)
+  if (node->externally_visible)
     return true;
   if (!flag_unit_at_a_time
       && lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
@@ -963,17 +963,6 @@ decide_is_variable_needed (struct cgraph_varpool_node *node, tree decl)
       && !DECL_EXTERNAL (decl))
     return true;
 
-  /* When emulating tls, we actually see references to the control
-     variable, rather than the user-level variable.  */
-  if (!targetm.have_tls
-      && TREE_CODE (decl) == VAR_DECL
-      && DECL_THREAD_LOCAL_P (decl))
-    {
-      tree control = emutls_decl (decl);
-      if (decide_is_variable_needed (cgraph_varpool_node (control), control))
-       return true;
-    }
-
   /* When not reordering top level variables, we have to assume that
      we are going to keep everything.  */
   if (flag_unit_at_a_time && flag_toplevel_reorder)
index 6b3cab01df5b7d8fd0b8d9fe8bf30e1f64d492d0..10c52ea42849b5935a5defceab12152f00ceafeb 100644 (file)
@@ -328,7 +328,10 @@ cgraph_varpool_remove_unreferenced_decls (void)
       node->needed = 0;
 
       if (node->finalized
-         && (decide_is_variable_needed (node, decl)
+         && ((DECL_ASSEMBLER_NAME_SET_P (decl)
+              && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
+             || node->force_output
+             || decide_is_variable_needed (node, decl)
              /* ??? Cgraph does not yet rule the world with an iron hand,
                 and does not control the emission of debug information.
                 After a variable has its DECL_RTL set, we must assume that
@@ -1709,7 +1712,6 @@ cgraph_build_static_cdtor (char which, tree body, int priority)
     {
       tree_lowering_passes (decl);
       tree_rest_of_compilation (decl);
-      cgraph_varpool_assemble_pending_decls ();
     }
   else
     cgraph_finalize_function (decl, 0);
index 7a79a7d711235dda364519e22fc40f1566546237..d07e0c63685cf658f77fc14ecc1a9daf39e62f81 100644 (file)
@@ -89,7 +89,7 @@ Boston, MA 02110-1301, USA.  */
     {                                                          \
       HOST_WIDE_INT size;                                      \
                                                                \
-      if (targetm.have_tls && DECL_THREAD_LOCAL_P (DECL))      \
+      if (DECL_THREAD_LOCAL_P (DECL))                          \
        ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "tls_object");   \
       else                                                     \
        ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");       \
index 161cee515943950f70e01a4457ca1a9401d51e4a..615f53c49e8cfb6d790c9d497b378757702e2833 100644 (file)
@@ -1,3 +1,7 @@
+2006-10-09  Richard Henderson  <rth@redhat.com>
+
+       Revert emutls patch.
+
 2006-10-04  Richard Henderson  <rth@redhat.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index fe74218a91dfd164e484fbcaab6a3a3243056301..84f2aaa49b3e15dfcf1c45f873b33c3aba6a7dfd 100644 (file)
@@ -6321,7 +6321,14 @@ grokvardecl (tree type,
     }
 
   if (declspecs->specs[(int)ds_thread])
-    DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+    {
+      if (targetm.have_tls)
+       DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+      else
+       /* A mere warning is sure to result in improper semantics
+          at runtime.  Don't bother to allow this to compile.  */
+       error ("thread-local storage not supported for this target");
+    }
 
   if (TREE_PUBLIC (decl))
     {
@@ -8449,7 +8456,15 @@ grokdeclarator (const cp_declarator *declarator,
                DECL_EXTERNAL (decl) = 1;
 
                if (thread_p)
-                 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+                 {
+                   if (targetm.have_tls)
+                     DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+                   else
+                     /* A mere warning is sure to result in improper
+                        semantics at runtime.  Don't bother to allow this to
+                        compile.  */
+                     error ("thread-local storage not supported for this target");
+                 }
              }
            else
              {
index c7d8efd8e5c5ac6dc452e163589bc80e91ccf670..2672f15afba7609839506e26d522377de22d7532 100644 (file)
@@ -18964,6 +18964,9 @@ cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
   vars = cp_parser_omp_var_list (parser, 0, NULL);
   cp_parser_require_pragma_eol (parser, pragma_tok);
 
+  if (!targetm.have_tls)
+    sorry ("threadprivate variables not supported in this target");
+
   finish_omp_threadprivate (vars);
 }
 
index 7b21bd13ad1a89437a51d5dcd7b86585f739b3f6..0b655b44d51214df691c495e8ed76a524f28e77e 100644 (file)
@@ -9130,7 +9130,7 @@ loc_descriptor_from_tree_1 (tree loc, int want_address)
          rtx rtl;
 
          /* If this is not defined, we have no way to emit the data.  */
-         if (!targetm.have_tls || !targetm.asm_out.output_dwarf_dtprel)
+         if (!targetm.asm_out.output_dwarf_dtprel)
            return 0;
 
          /* The way DW_OP_GNU_push_tls_address is specified, we can only
index f26d21772e3907607352891f604ca8b6fe13dfc7..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,193 +0,0 @@
-/* TLS emulation.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   Contributed by Jakub Jelinek <jakub@redhat.com>.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-In addition to the permissions in the GNU General Public License, the
-Free Software Foundation gives you unlimited permission to link the
-compiled version of this file into combinations with other programs,
-and to distribute those combinations without any restriction coming
-from the use of this file.  (The General Public License restrictions
-do apply in other respects; for example, they cover modification of
-the file, and distribution when not linked into a combine
-executable.)
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
-
-#include "tconfig.h"
-#include "tsystem.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "gthr.h"
-
-typedef unsigned int word __attribute__((mode(word)));
-typedef unsigned int pointer __attribute__((mode(pointer)));
-
-struct __emutls_object
-{
-  word size;
-  word align;
-  union {
-    pointer offset;
-    void *ptr;
-  } loc;
-  void *templ;
-};
-
-#ifdef __GTHREADS
-#ifdef __GTHREAD_MUTEX_INIT
-static __gthread_mutex_t emutls_mutex = __GTHREAD_MUTEX_INIT;
-#else
-static __gthread_mutex_t emutls_mutex;
-#endif
-static __gthread_key_t emutls_key;
-static pointer emutls_size;
-
-static void
-emutls_destroy (void *ptr)
-{
-  void ***arr = (void ***) ptr;
-  unsigned long int size = (unsigned long int) arr[0];
-  ++arr;
-  while (--size)
-    {
-      if (*arr)
-       free ((*arr)[-1]);
-      ++arr;
-    }
-  free (ptr);
-}
-
-static void
-emutls_init (void)
-{
-#ifndef __GTHREAD_MUTEX_INIT
-  __GTHREAD_MUTEX_INIT_FUNCTION (&emutls_mutex);
-#endif
-  if (__gthread_key_create (&emutls_key, emutls_destroy) != 0)
-    abort ();
-}
-#endif
-
-static void *
-emutls_alloc (struct __emutls_object *obj)
-{
-  void *ptr;
-  void *ret;
-
-  /* We could use here posix_memalign if available and adjust
-     emutls_destroy accordingly.  */
-  if (obj->align <= sizeof (void *))
-    {
-      ptr = malloc (obj->size + sizeof (void *));
-      if (ptr == NULL)
-       abort ();
-      ((void **) ptr)[0] = ptr;
-      ret = ptr + sizeof (void *);
-    }
-  else
-    {
-      ptr = malloc (obj->size + sizeof (void *) + obj->align - 1);
-      if (ptr == NULL)
-       abort ();
-      ret = (void *) (((pointer) (ptr + sizeof (void *) + obj->align - 1))
-                     & ~(pointer)(obj->align - 1));
-      ((void **) ret)[-1] = ptr;
-    }
-
-  if (obj->templ)
-    memcpy (ret, obj->templ, obj->size);
-  else
-    memset (ret, 0, obj->size);
-
-  return ret;
-}
-
-void *
-__emutls_get_address (struct __emutls_object *obj)
-{
-  if (! __gthread_active_p ())
-    {
-      if (__builtin_expect (obj->loc.ptr == NULL, 0))
-       obj->loc.ptr = emutls_alloc (obj);
-      return obj->loc.ptr;
-    }
-
-#ifndef __GTHREADS
-  abort ();
-#else
-  pointer offset;
-
-  if (__builtin_expect (obj->loc.offset == 0, 0))
-    {
-      static __gthread_once_t once = __GTHREAD_ONCE_INIT;
-      __gthread_once (&once, emutls_init);
-      __gthread_mutex_lock (&emutls_mutex);
-      offset = ++emutls_size;
-      obj->loc.offset = offset;
-      __gthread_mutex_unlock (&emutls_mutex);
-    }
-  else
-    offset = obj->loc.offset;
-
-  void **arr = (void **) __gthread_getspecific (emutls_key);
-  if (__builtin_expect (arr == NULL, 0))
-    {
-      pointer size = offset + 32;
-      arr = calloc (size, sizeof (void *));
-      if (arr == NULL)
-       abort ();
-      arr[0] = (void *) size;
-      __gthread_setspecific (emutls_key, (void *) arr);
-    }
-  else if (__builtin_expect (offset >= (pointer) arr[0], 0))
-    {
-      pointer orig_size = (pointer) arr[0];
-      pointer size = orig_size * 2;
-      if (offset >= size)
-       size = offset + 32;
-      arr = realloc (arr, size * sizeof (void *));
-      if (arr == NULL)
-       abort ();
-      memset (arr + orig_size, 0, (size - orig_size) * sizeof (void *));
-      __gthread_setspecific (emutls_key, (void *) arr);
-    }
-
-  void *ret = arr[offset];
-  if (__builtin_expect (ret == NULL, 0))
-    {
-      ret = emutls_alloc (obj);
-      arr[offset] = ret;
-    }
-  return ret;
-#endif
-}
-
-void
-__emutls_register_common (struct __emutls_object *obj,
-                         word size, word align, void *templ)
-{
-  if (obj->size < size)
-    {
-      obj->size = size;
-      obj->templ = NULL;
-    }
-  if (obj->align < align)
-    obj->align = align;
-  if (templ && size == obj->size)
-    obj->templ = templ;
-}
index 24500ebc057ec162fd8b110fd379b6981c65e5c8..a0dc9c360f08fffa55629f1b9b1ef9560a0171d5 100644 (file)
@@ -6360,19 +6360,6 @@ highest_pow2_factor_for_target (tree target, tree exp)
   return MAX (factor, target_align);
 }
 \f
-/* Return &VAR expression for emulated thread local VAR.  */
-
-static tree
-emutls_var_address (tree var)
-{
-  tree emuvar = emutls_decl (var);
-  tree fn = built_in_decls [BUILT_IN_EMUTLS_GET_ADDRESS];
-  tree arg = build_fold_addr_expr_with_type (emuvar, ptr_type_node);
-  tree arglist = build_tree_list (NULL_TREE, arg);
-  tree call = build_function_call_expr (fn, arglist);
-  return fold_convert (build_pointer_type (TREE_TYPE (var)), call);
-}
-\f
 /* Expands variable VAR.  */
 
 void
@@ -6501,18 +6488,6 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
       inner = TREE_OPERAND (exp, 0);
       break;
 
-    case VAR_DECL:
-      /* TLS emulation hook - replace __thread VAR's &VAR with
-        __emutls_get_address (&_emutls.VAR).  */
-      if (! targetm.have_tls
-         && TREE_CODE (exp) == VAR_DECL
-         && DECL_THREAD_LOCAL_P (exp))
-       {
-         exp = emutls_var_address (exp);
-         return expand_expr (exp, target, tmode, modifier);
-       }
-      /* Fall through.  */
-
     default:
       /* If the object is a DECL, then expand it for its rtl.  Don't bypass
         expand_expr, as that can have various side effects; LABEL_DECLs for
@@ -6878,16 +6853,6 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
        layout_decl (exp, 0);
 
-      /* TLS emulation hook - replace __thread vars with
-        *__emutls_get_address (&_emutls.var).  */
-      if (! targetm.have_tls
-         && TREE_CODE (exp) == VAR_DECL
-         && DECL_THREAD_LOCAL_P (exp))
-       {
-         exp = build_fold_indirect_ref (emutls_var_address (exp));
-         return expand_expr_real_1 (exp, target, tmode, modifier, NULL);
-       }
-
       /* ... fall through ...  */
 
     case FUNCTION_DECL:
index a8758cd54fdcba03297c88c6e007afcef1ded290..85c9533ffcf2f2422fec6b3066762e776280d603 100644 (file)
@@ -1,3 +1,7 @@
+2006-10-09  Richard Henderson  <rth@redhat.com>
+
+       Revert emutls patch.
+
 2006-10-09  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        * intrinsic.c (add_sym_0s, add_sym_1s, add_sym_2s, add_sym_3s,
index 02e914f6d3d4641a713aa454c4a139ef7233fab5..6dc00da63a3782d2ac03b017755facc24f812fe7 100644 (file)
@@ -1102,14 +1102,6 @@ gfc_init_builtin_functions (void)
                      BUILT_IN_TRAP, NULL, false);
   TREE_THIS_VOLATILE (built_in_decls[BUILT_IN_TRAP]) = 1;
 
-  gfc_define_builtin ("__emutls_get_address",
-                     builtin_types[BT_FN_PTR_PTR], BUILT_IN_EMUTLS_GET_ADDRESS,
-                     "__emutls_get_address", true);
-  gfc_define_builtin ("__emutls_register_common",
-                     builtin_types[BT_FN_VOID_PTR_WORD_WORD_PTR],
-                     BUILT_IN_EMUTLS_REGISTER_COMMON,
-                     "__emutls_register_common", false);
-
   build_common_builtin_nodes ();
   targetm.init_builtins ();
 }
index 81faf4978c2d1810b2e6603709c4c2ec610b8e3f..09ec255974cc8f787fbdbe60964427264bed39ae 100644 (file)
@@ -465,6 +465,12 @@ gfc_match_omp_threadprivate (void)
   if (m != MATCH_YES)
     return m;
 
+  if (!targetm.have_tls)
+    {
+      sorry ("threadprivate variables not supported in this target");
+      goto cleanup;
+    }
+
   for (;;)
     {
       m = gfc_match_symbol (&sym, 0);
index e580494f068e808802cefa65e58cc28f064308cc..5350eacdef05c14f6fb7e304ea747938b9cd655c 100644 (file)
@@ -388,7 +388,7 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init)
 
       gfc_set_decl_location (decl, &com->where);
 
-      if (com->threadprivate)
+      if (com->threadprivate && targetm.have_tls)
        DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
 
       /* Place the back end declaration for this common block in
index 4d410b101a7fbd8f47436112798f890614895787..72500229558818ab87ef2f4fdd7da84d5d55142f 100644 (file)
@@ -522,7 +522,7 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
     TREE_STATIC (decl) = 1;
 
   /* Handle threadprivate variables.  */
-  if (sym->attr.threadprivate
+  if (sym->attr.threadprivate && targetm.have_tls
       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
     DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
 }
index 0abd8459d967a6f5e67e41e49fc129d531455c35..5a3e5d72221c6daaed44212a56ffd27f29dd8b1c 100644 (file)
@@ -55,7 +55,6 @@ DEF_PRIMITIVE_TYPE (BT_BOOL, boolean_type_node)
 DEF_PRIMITIVE_TYPE (BT_INT, integer_type_node)
 DEF_PRIMITIVE_TYPE (BT_UINT, unsigned_type_node)
 DEF_PRIMITIVE_TYPE (BT_LONG, long_integer_type_node)
-DEF_PRIMITIVE_TYPE (BT_WORD, (*lang_hooks.types.type_for_mode) (word_mode, 1))
 
 DEF_PRIMITIVE_TYPE (BT_I1, builtin_type_for_size (BITS_PER_UNIT*1, 1))
 DEF_PRIMITIVE_TYPE (BT_I2, builtin_type_for_size (BITS_PER_UNIT*2, 1))
@@ -82,7 +81,6 @@ DEF_FUNCTION_TYPE_1 (BT_FN_VOID_PTR, BT_VOID, BT_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_VOID_PTRPTR, BT_VOID, BT_PTR_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_VOID_VPTR, BT_VOID, BT_VOLATILE_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_UINT_UINT, BT_UINT, BT_UINT)
-DEF_FUNCTION_TYPE_1 (BT_FN_PTR_PTR, BT_PTR, BT_PTR)
 
 DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR, BT_FN_VOID_PTR)
 
@@ -115,8 +113,6 @@ DEF_FUNCTION_TYPE_3 (BT_FN_VOID_OMPFN_PTR_UINT, BT_VOID, BT_PTR_FN_VOID_PTR,
 
 DEF_FUNCTION_TYPE_4 (BT_FN_VOID_OMPFN_PTR_UINT_UINT,
                      BT_VOID, BT_PTR_FN_VOID_PTR, BT_PTR, BT_UINT, BT_UINT)
-DEF_FUNCTION_TYPE_4 (BT_FN_VOID_PTR_WORD_WORD_PTR,
-                    BT_VOID, BT_PTR, BT_WORD, BT_WORD, BT_PTR)
 
 DEF_FUNCTION_TYPE_5 (BT_FN_BOOL_LONG_LONG_LONG_LONGPTR_LONGPTR,
                      BT_BOOL, BT_LONG, BT_LONG, BT_LONG,
index 822b6745b7817c531e79fefaa93e6fe5dbf15dcf..f8e9e52d0820d24ee70cbe6deebeff4dcb757fae 100644 (file)
@@ -273,6 +273,4 @@ GCC_4.2.0 {
   __floatuntixf
   __floatuntitf
   _Unwind_GetIPInfo
-  __emutls_get_address
-  __emutls_register_common
 }
index 658c7bd3590c65e7ec7a50742a80da521901f118..3cfe32c93cfb56bac3c867d464e9296edd07209b 100644 (file)
@@ -158,9 +158,6 @@ extern void merge_weak (tree, tree);
 /* Emit any pending weak declarations.  */
 extern void weak_finish (void);
 
-/* Emit any pending emutls declarations and initializations.  */
-extern void emutls_finish (void);
-
 /* Decode an `asm' spec for a declaration as a register name.
    Return the register number, or -1 if nothing specified,
    or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
index c477d679d08b2f72701aa48d0106c3ab2cd17c70..f60a8ee51c6492d1afe163b266e64ed6bbb5c887 100644 (file)
@@ -1,3 +1,7 @@
+2006-10-09  Richard Henderson  <rth@redhat.com>
+
+       Revert emutls patch.
+
 2006-10-09  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/29254
index 1098190ebd04acb16f6b7a7f690f28048b39601b..28cb47e504190dcac02a68636152c250eb1ad0f9 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do link } */
 /* { dg-require-alias "" } */
 /* { dg-require-visibility "" } */
+/* { dg-require-effective-target tls } */
 /* Test that encode_section_info handles the change from externally
    defined to locally defined (via hidden).   Extracted from glibc.  */
 
index 476fe7cbb72e5c792cdd0f1a8a15f05081d60d25..b77e550d7bf7f29976b3f5e8d6242182379a1170 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-options "-Werror" } */
+/* { dg-require-effective-target tls } */
 __thread int i;
 
 int foo ()
index 719f0645771ae608dbe6dbb655163f86f4e74938..67d7be69cc50c8be3658c30440dce591e61b3449 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-do assemble } */
 /* { dg-options "-g" } */
+/* { dg-require-effective-target tls } */
 
 __thread int i;
index ae4f3d4a3c28c7e9b21f58724078572f5fc2b020..56b570c94a5c74803232ad254ba9e661fe429a34 100644 (file)
@@ -1,4 +1,5 @@
 /* Valid __thread specifiers.  */
+/* { dg-require-effective-target tls } */
 
 __thread int g1;
 extern __thread int g2;
index 5e7e17bee5ab64144f2c64ef8bff08a66fa364f9..8276cb3be4902553c2da9b5d64685480bcf9e51a 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid __thread specifiers.  */
+/* { dg-require-effective-target tls } */
 
 __thread extern int g1;                /* { dg-error "'__thread' before 'extern'" } */
 __thread static int g2;                /* { dg-error "'__thread' before 'static'" } */
index f1ce06b70d8f8e6c406a0e19b0fc4a928b89c11c..45d89b43722b74566620b43767408c45282fb043 100644 (file)
@@ -1,4 +1,5 @@
 /* Report invalid extern and __thread combinations.  */
+/* { dg-require-effective-target tls } */
 
 extern int j;          /* { dg-error "previous declaration" } */
 __thread int j;                /* { dg-error "follows non-thread-local" } */
index df3705d04ee2f1f3c6f4ff621cff7016ccf1efe9..fed2f3accd33fcfd9e9a341b479b8ac302df760f 100644 (file)
@@ -1,5 +1,6 @@
 /* Invalid __thread specifiers.  As diag-4.c but some cases in
    different orders.  */
+/* { dg-require-effective-target tls } */
 
 __thread typedef int g4;       /* { dg-error "'__thread' used with 'typedef'" } */
 
index 623832c3812f5e6bd5a49af0732fdf013260fadd..219396d768ae3fc8eb837cb5694b02a34f2aefb2 100644 (file)
@@ -1,3 +1,4 @@
 /* __thread specifiers on empty declarations.  */
+/* { dg-require-effective-target tls } */
 
 __thread struct foo; /* { dg-warning "warning: useless '__thread' in empty declaration" } */
index 97258643bf2807b56996fb09c72f594501489947..fa4208dce0c1cac31e44f54446e70bfb5ef69678 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid initializations.  */
+/* { dg-require-effective-target tls } */
 
 extern __thread int i;
 int *p = &i;   /* { dg-error "initializer element is not constant" } */
index 0896df60b56533c9ca475f02e4c4479d71973450..9c592a985563850b4ab8158c8aefa3294155860f 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -ftls-model=initial-exec" } */
+/* { dg-require-effective-target tls } */
 
 extern __thread long e1;
 extern __thread int e2;
index f31c1fff81627259fd9b1924035beab49c757a44..a710a062ca376113342f8ef7a0b35825d18e13a2 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O3 -fpic" } */
+/* { dg-require-effective-target tls } */
 
 /* The web pass was creating unrecognisable pic_load_dot_plus_four insns
    on ARM.  */
index d8a686ddb462037366c09972a836caa7e8d0709d..0604f3253c11cc50e2fd428ac6f242bbafe5ff90 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 /* Sched1 moved {load_tp} pattern between strlen call and the copy
    of the hard return value to its pseudo.  This resulted in a
    reload abort, since the hard register was not spillable.  */
index de04c1cb3fc494822ef279b9f1fc124919dfbe76..8a01c019c10b99cc4e9080ea268ff8fa7d59b94e 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 
 extern void abort (void);
 extern void exit (int);
index dec0eabcb4ce749ebeb4dbb356cc3113bbc800eb..a7331115352c632de00727174fa651717fac326d 100644 (file)
@@ -1,6 +1,7 @@
 /* PR 18910 */
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 
 static __thread void *foo [2];
 void
index 3829c66fc559e93c9b874427d55fedfff8fde0d2..cc62ef57a5dfd0ff41346a063bd33e811e284c3a 100644 (file)
@@ -1,6 +1,7 @@
 /* PR 21412 */
 /* { dg-do compile */
 /* { dg-options "-O2 -fPIC" } */
+/* { dg-require-effective-target tls } */
 
 struct S { int x[10]; };
 extern __thread struct S s;
index f5b020b7db601f4434df35b29720ce607b4a44e9..bcd42bd8572cef972854a7faddd06b87852d92ab 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fpic -ftls-model=global-dynamic" } */
+/* { dg-require-effective-target tls } */
 
 extern __thread long e1;
 extern __thread int e2;
index 11151236d90716ffb5d54e29afa493560402c186..5fd6be439055902d3dfc8892a0d8229dc9fae329 100644 (file)
@@ -2,6 +2,7 @@
    to allow addends for @dtpoff relocs or not.  */
 /* { dg-do compile } */
 /* { dg-options "-O2 -fpic" } */
+/* { dg-require-effective-target tls } */
 
 struct S {
   int s0, s1, s2, s3;
index 1fd70631f33b78379c81232b8e5e8f8ab1094618..96b8e49a665c4bd2323ef28269c01ac120e98824 100644 (file)
@@ -1 +1,3 @@
+/* { dg-require-effective-target tls } */
+
 __thread int i;
index 074cdb2571898b89c15e7aabe738b1264fac0a95..7776cb4f687d9deb3b31b055c45cce9257110ce9 100644 (file)
@@ -384,7 +384,7 @@ proc check_effective_target_pcc_bitfield_type_matters { } {
     }]
 }
 
-# Return 1 if *native* thread local storage (TLS) is supported, 0 otherwise.
+# Return 1 if thread local storage (TLS) is supported, 0 otherwise.
 #
 # This won't change for different subtargets so cache the result.
 
@@ -406,19 +406,11 @@ proc check_effective_target_tls {} {
        close $f
 
        # Test for thread-local data supported by the platform.
-       set comp_output [${tool}_target_compile $src $asm assembly ""]
+       set comp_output \
+           [${tool}_target_compile $src $asm assembly ""]
        file delete $src
        if { [string match "*not supported*" $comp_output] } {
            set et_tls_saved 0
-       } else {
-           set fd [open $asm r]
-           set text [read $fd]
-           close $fd
-           if { [string match "*emutls*" $text]} {
-               set et_tls_saved 0
-           } else {
-               set et_tls_saved 1
-           }
        }
        remove-build-file $asm
     }
index f7b2736b1e860c7f905ec9f9f24703e38c7fcdcc..53fcdfe580c830bd125b6683dad61a8e173f71e8 100644 (file)
@@ -1056,14 +1056,11 @@ compile_file (void)
   if (flag_mudflap)
     mudflap_finish_file ();
 
-  /* Likewise for emulated thread-local storage.  */
-  if (!targetm.have_tls)
-    emutls_finish ();
-
   output_shared_constant_pool ();
   output_object_blocks ();
 
   /* Write out any pending weak symbol declarations.  */
+
   weak_finish ();
 
   /* Do dbx symbols.  */
index f37d2a7c7e42b8bb9a075bef4671e51b68d9483d..9dbc399d2cd885cad361474dfc109b7bea896b3f 100644 (file)
@@ -1,5 +1,5 @@
 /* Memory address lowering and addressing mode selection.
-   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2004 Free Software Foundation, Inc.
    
 This file is part of GCC.
    
@@ -134,15 +134,10 @@ gen_addr_rtx (rtx symbol, rtx base, rtx index, rtx step, rtx offset,
       act_elem = symbol;
       if (offset)
        {
-         act_elem = gen_rtx_PLUS (Pmode, act_elem, offset);
-
+         act_elem = gen_rtx_CONST (Pmode,
+                                   gen_rtx_PLUS (Pmode, act_elem, offset));
          if (offset_p)
-           *offset_p = &XEXP (act_elem, 1);
-
-         if (GET_CODE (symbol) == SYMBOL_REF
-             || GET_CODE (symbol) == LABEL_REF
-             || GET_CODE (symbol) == CONST)
-           act_elem = gen_rtx_CONST (Pmode, act_elem);
+           *offset_p = &XEXP (XEXP (act_elem, 0), 1);
        }
 
       if (*addr)
index c7838145abbc2f3c5da1a90afe9a1b63a5a790b3..c2ea4798a5947123c7fd07f1f9105e71d3ab2d1c 100644 (file)
@@ -4460,7 +4460,6 @@ extern void set_user_assembler_name (tree, const char *);
 extern void process_pending_assemble_externals (void);
 extern void finish_aliases_1 (void);
 extern void finish_aliases_2 (void);
-extern tree emutls_decl (tree);
 
 /* In stmt.c */
 extern void expand_computed_goto (tree);
index d14dc7018c8d3b293ad79bd0005673fd5c024e0e..819add8afba633de0c219abc5c410bdf4a05a6cb 100644 (file)
@@ -53,7 +53,6 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "cgraph.h"
 #include "cfglayout.h"
 #include "basic-block.h"
-#include "tree-iterator.h"
 
 #ifdef XCOFF_DEBUGGING_INFO
 #include "xcoffout.h"          /* Needed for external data
@@ -201,236 +200,6 @@ static GTY(()) int anchor_labelno;
 /* A pool of constants that can be shared between functions.  */
 static GTY(()) struct rtx_constant_pool *shared_constant_pool;
 
-/* TLS emulation.  */
-
-static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
-     htab_t emutls_htab;
-static GTY (()) tree emutls_object_type;
-
-#ifndef NO_DOT_IN_LABEL
-# define EMUTLS_VAR_PREFIX     "__emutls_v."
-# define EMUTLS_TMPL_PREFIX    "__emutls_t."
-#elif !defined NO_DOLLAR_IN_LABEL
-# define EMUTLS_VAR_PREFIX     "__emutls_v$"
-# define EMUTLS_TMPL_PREFIX    "__emutls_t$"
-#else
-# define EMUTLS_VAR_PREFIX     "__emutls_v_"
-# define EMUTLS_TMPL_PREFIX    "__emutls_t_"
-#endif
-
-/* Create an identifier for the struct __emutls_object, given an identifier
-   of the DECL_ASSEMBLY_NAME of the original object.  */
-
-static tree
-get_emutls_object_name (tree name)
-{
-  char *toname = alloca (strlen (IDENTIFIER_POINTER (name))
-                        + sizeof (EMUTLS_VAR_PREFIX));
-  strcpy (toname, EMUTLS_VAR_PREFIX);
-  strcpy (toname + sizeof (EMUTLS_VAR_PREFIX) - 1, IDENTIFIER_POINTER (name));
-
-  return get_identifier (toname);
-}
-
-/* Create the structure for struct __emutls_object.  This should match the
-   structure at the top of emutls.c, modulo the union there.  */
-
-static tree
-get_emutls_object_type (void)
-{
-  tree type, type_name, field, next_field, word_type_node;
-
-  type = emutls_object_type;
-  if (type)
-    return type;
-
-  emutls_object_type = type = lang_hooks.types.make_type (RECORD_TYPE);
-  type_name = get_identifier ("__emutls_object");
-  type_name = build_decl (TYPE_DECL, type_name, type);
-  TYPE_NAME (type) = type_name;
-
-  field = build_decl (FIELD_DECL, get_identifier ("__templ"), ptr_type_node);
-  DECL_CONTEXT (field) = type;
-  next_field = field;
-
-  field = build_decl (FIELD_DECL, get_identifier ("__offset"), ptr_type_node);
-  DECL_CONTEXT (field) = type;
-  TREE_CHAIN (field) = next_field;
-  next_field = field;
-
-  word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
-  field = build_decl (FIELD_DECL, get_identifier ("__align"), word_type_node);
-  DECL_CONTEXT (field) = type;
-  TREE_CHAIN (field) = next_field;
-  next_field = field;
-
-  field = build_decl (FIELD_DECL, get_identifier ("__size"), word_type_node);
-  DECL_CONTEXT (field) = type;
-  TREE_CHAIN (field) = next_field;
-
-  TYPE_FIELDS (type) = field;
-  layout_type (type);
-
-  return type;
-}
-
-/* Create a read-only variable like DECL, with the same DECL_INITIAL.
-   This will be used for initializing the emulated tls data area.  */
-
-static tree
-get_emutls_init_templ_addr (tree decl)
-{
-  tree name, to;
-  char *toname;
-
-  if (!DECL_INITIAL (decl))
-    return null_pointer_node;
-
-  name = DECL_ASSEMBLER_NAME (decl);
-  toname = alloca (strlen (IDENTIFIER_POINTER (name))
-                  + sizeof (EMUTLS_TMPL_PREFIX));
-  strcpy (toname, EMUTLS_TMPL_PREFIX);
-  strcpy (toname + sizeof (EMUTLS_TMPL_PREFIX) - 1, IDENTIFIER_POINTER (name));
-  name = get_identifier (toname);
-
-  to = build_decl (VAR_DECL, name, TREE_TYPE (decl));
-  SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to));
-
-  DECL_ARTIFICIAL (to) = 1;
-  TREE_USED (to) = TREE_USED (decl);
-  TREE_READONLY (to) = 1;
-  DECL_IGNORED_P (to) = 1;
-  DECL_CONTEXT (to) = DECL_CONTEXT (decl);
-  DECL_WEAK (to) = DECL_WEAK (decl);
-  if (DECL_ONE_ONLY (decl))
-    {
-      make_decl_one_only (to);
-      TREE_STATIC (to) = TREE_STATIC (decl);
-      TREE_PUBLIC (to) = TREE_PUBLIC (decl);
-      DECL_VISIBILITY (to) = DECL_VISIBILITY (decl);
-    }
-  else
-    TREE_STATIC (to) = 1;
-      
-  DECL_INITIAL (to) = DECL_INITIAL (decl);
-  DECL_INITIAL (decl) = NULL;
-
-  cgraph_varpool_finalize_decl (to);
-  return build_fold_addr_expr (to);
-}
-
-/* When emulating tls, we use a control structure for use by the runtime.
-   Create and return this structure.  */
-
-tree
-emutls_decl (tree decl)
-{
-  tree name, to;
-  struct tree_map *h, in;
-  void **loc;
-
-  if (targetm.have_tls || decl == NULL || decl == error_mark_node
-      || TREE_CODE (decl) != VAR_DECL || ! DECL_THREAD_LOCAL_P (decl))
-    return decl;
-
-  /* Look up the object in the hash; return the control structure if
-     it has already been created.  */
-  if (! emutls_htab)
-    emutls_htab = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
-
-  name = DECL_ASSEMBLER_NAME (decl);
-
-  /* Note that we use the hash of the decl's name, rather than a hash
-     of the decl's pointer.  In emutls_finish we iterate through the
-     hash table, and we want this traversal to be predictable.  */
-  in.hash = htab_hash_string (IDENTIFIER_POINTER (name));
-  in.from = decl;
-  loc = htab_find_slot_with_hash (emutls_htab, &in, in.hash, INSERT);
-  h = *loc;
-  if (h != NULL)
-    to = h->to;
-  else
-    {
-      to = build_decl (VAR_DECL, get_emutls_object_name (name),
-                      get_emutls_object_type ());
-
-      h = ggc_alloc (sizeof (struct tree_map));
-      h->hash = in.hash;
-      h->from = decl;
-      h->to = to;
-      *(struct tree_map **) loc = h;
-
-      DECL_ARTIFICIAL (to) = 1;
-      DECL_IGNORED_P (to) = 1;
-      TREE_READONLY (to) = 0;
-
-      SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to));
-      if (DECL_ONE_ONLY (decl))
-       make_decl_one_only (to);
-      DECL_CONTEXT (to) = DECL_CONTEXT (decl);
-    }
-
-  /* Note that these fields may need to be updated from time to time from
-     the original decl.  Consider:
-       extern __thread int i;
-       int foo() { return i; }
-       __thread int i = 1;
-     in which I goes from external to locally defined and initialized.  */
-
-  TREE_STATIC (to) = TREE_STATIC (decl);
-  TREE_USED (to) = TREE_USED (decl);
-  TREE_PUBLIC (to) = TREE_PUBLIC (decl);
-  DECL_EXTERNAL (to) = DECL_EXTERNAL (decl);
-  DECL_COMMON (to) = DECL_COMMON (decl);
-  DECL_WEAK (to) = DECL_WEAK (decl);
-  DECL_VISIBILITY (to) = DECL_VISIBILITY (decl);
-
-  return to;
-}
-
-static int
-emutls_common_1 (void **loc, void *xstmts)
-{
-  struct tree_map *h = *(struct tree_map **) loc;
-  tree args, x, *pstmts = (tree *) xstmts;
-  tree word_type_node;
-
-  if (!DECL_COMMON (h->from))
-    return 1;
-
-  word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
-  
-  x = get_emutls_init_templ_addr (h->from);
-  args = tree_cons (NULL, x, NULL);
-  x = build_int_cst (word_type_node, DECL_ALIGN_UNIT (h->from));
-  args = tree_cons (NULL, x, args);
-  x = fold_convert (word_type_node, DECL_SIZE_UNIT (h->from));
-  args = tree_cons (NULL, x, args);
-  x = build_fold_addr_expr (h->to);
-  args = tree_cons (NULL, x, args);
-
-  x = built_in_decls[BUILT_IN_EMUTLS_REGISTER_COMMON];
-  x = build_function_call_expr (x, args);
-
-  append_to_statement_list (x, pstmts);
-  return 1;
-}
-
-void
-emutls_finish (void)
-{
-  tree body = NULL_TREE;
-
-  if (emutls_htab == NULL)
-    return;
-
-  htab_traverse_noresize (emutls_htab, emutls_common_1, &body);
-  if (body == NULL_TREE)
-    return;
-
-  cgraph_build_static_cdtor ('I', body, DEFAULT_INIT_PRIORITY);
-}
-
 /* Helper routines for maintaining section_htab.  */
 
 static int
@@ -1964,50 +1733,6 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
   rtx decl_rtl, symbol;
   section *sect;
 
-  if (! targetm.have_tls
-      && TREE_CODE (decl) == VAR_DECL
-      && DECL_THREAD_LOCAL_P (decl))
-    {
-      tree to = emutls_decl (decl);
-
-      /* If this variable is defined locally, then we need to initialize the
-         control structure with size and alignment information.  We do this
-        at the last moment because tentative definitions can take a locally
-        defined but uninitialized variable and initialize it later, which
-        would result in incorrect contents.  */
-      if (! DECL_EXTERNAL (to) && ! DECL_COMMON (to))
-       {
-         VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 4);
-         constructor_elt *elt;
-         tree type = TREE_TYPE (to);
-         tree field = TYPE_FIELDS (type);
-
-         elt = VEC_quick_push (constructor_elt, v, NULL);
-         elt->index = field;
-         elt->value = fold_convert (TREE_TYPE (field), DECL_SIZE_UNIT (decl));
-
-         elt = VEC_quick_push (constructor_elt, v, NULL);
-         field = TREE_CHAIN (field);
-         elt->index = field;
-         elt->value = build_int_cst (TREE_TYPE (field),
-                                     DECL_ALIGN_UNIT (decl));
-
-         elt = VEC_quick_push (constructor_elt, v, NULL);
-         field = TREE_CHAIN (field);
-         elt->index = field;
-         elt->value = null_pointer_node;
-
-         elt = VEC_quick_push (constructor_elt, v, NULL);
-         field = TREE_CHAIN (field);
-         elt->index = field;
-         elt->value = get_emutls_init_templ_addr (decl);
-
-         DECL_INITIAL (to) = build_constructor (type, v);
-       }
-
-      decl = to;
-    }
-
   if (lang_hooks.decls.prepare_assemble_variable)
     lang_hooks.decls.prepare_assemble_variable (decl);
 
@@ -5135,14 +4860,6 @@ do_assemble_alias (tree decl, tree target)
     {
       ultimate_transparent_alias_target (&target);
 
-      if (!targetm.have_tls
-         && TREE_CODE (decl) == VAR_DECL
-         && DECL_THREAD_LOCAL_P (decl))
-       {
-         decl = emutls_decl (decl);
-         target = get_emutls_object_name (target);
-       }
-
       if (!TREE_SYMBOL_REFERENCED (target))
        weakref_targets = tree_cons (decl, target, weakref_targets);
 
@@ -5160,14 +4877,6 @@ do_assemble_alias (tree decl, tree target)
       return;
     }
 
-  if (!targetm.have_tls
-      && TREE_CODE (decl) == VAR_DECL
-      && DECL_THREAD_LOCAL_P (decl))
-    {
-      decl = emutls_decl (decl);
-      target = get_emutls_object_name (target);
-    }
-
 #ifdef ASM_OUTPUT_DEF
   /* Make name accessible from other files, if appropriate.  */
 
@@ -6050,8 +5759,7 @@ default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
     flags |= SYMBOL_FLAG_FUNCTION;
   if (targetm.binds_local_p (decl))
     flags |= SYMBOL_FLAG_LOCAL;
-  if (targetm.have_tls && TREE_CODE (decl) == VAR_DECL
-      && DECL_THREAD_LOCAL_P (decl))
+  if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
     flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
   else if (targetm.in_small_data_p (decl))
     flags |= SYMBOL_FLAG_SMALL;