From a13e882c791e640f1c53bc8f5a9b142705af650b Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Tue, 3 Jan 2006 17:19:21 +0100
Subject: [PATCH] varasm.c (assemble_variable): Handle thread-local COMMON
 data.

        * varasm.c (assemble_variable): Handle thread-local COMMON data.
        * defaults.h (ASM_OUTPUT_TLS_COMMON): Define.

Co-Authored-By: Richard Henderson <rth@redhat.com>

From-SVN: r109282
---
 gcc/ChangeLog  |  7 +++++++
 gcc/defaults.h | 12 ++++++++++++
 gcc/varasm.c   | 13 +++++++++++--
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b0aa2ab92b5d..d2e57cebcd8e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-03  Jakub Jelinek  <jakub@redhat.com>
+	    Richard Henderson  <rth@redhat.com>
+
+	Merge from gomp-branch:
+        * varasm.c (assemble_variable): Handle thread-local COMMON data.
+        * defaults.h (ASM_OUTPUT_TLS_COMMON): Define.
+
 2006-01-03  Paolo Bonzini  <bonzini@gnu.org>
 
 	PR rtl-optimization/25578
diff --git a/gcc/defaults.h b/gcc/defaults.h
index eb7733d73cd2..1207b7be614c 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -114,6 +114,18 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #endif
 #endif
 
+#if defined (HAVE_AS_TLS) && !defined (ASM_OUTPUT_TLS_COMMON)
+#define ASM_OUTPUT_TLS_COMMON(FILE, DECL, NAME, SIZE)			\
+  do									\
+    {									\
+      fprintf ((FILE), "\t.tls_common\t");				\
+      assemble_name ((FILE), (NAME));					\
+      fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",		\
+	       (SIZE), DECL_ALIGN (DECL) / BITS_PER_UNIT);		\
+    }									\
+  while (0)
+#endif
+
 /* Decide whether to defer emitting the assembler output for an equate
    of two values.  The default is to not defer output.  */
 #ifndef TARGET_DEFERRED_OUTPUT_DEFS
diff --git a/gcc/varasm.c b/gcc/varasm.c
index eafba6b0bc8b..5f58bf4cef68 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1537,11 +1537,20 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
      isn't common, and shouldn't be handled as such.  */
   if (DECL_SECTION_NAME (decl) || dont_output_data)
     ;
-  /* We don't implement common thread-local data at present.  */
   else if (DECL_THREAD_LOCAL_P (decl))
     {
       if (DECL_COMMON (decl))
-	sorry ("thread-local COMMON data not implemented");
+	{
+#ifdef ASM_OUTPUT_TLS_COMMON
+	  unsigned HOST_WIDE_INT size;
+
+	  size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
+	  ASM_OUTPUT_TLS_COMMON (asm_out_file, decl, name, size);
+	  return;
+#else
+	  sorry ("thread-local COMMON data not implemented");
+#endif
+	}
     }
   else if (DECL_INITIAL (decl) == 0
 	   || DECL_INITIAL (decl) == error_mark_node
-- 
GitLab