9d32d8a
2009-07-22  Jason Merrill  <jason@redhat.com>
9d32d8a
9d32d8a
	* config/elfos.h (ASM_DECLARE_OBJECT_NAME): Use gnu_unique_object
9d32d8a
	type if available.
9d32d8a
	* configure.ac: Test for it.
9d32d8a
	* configure, config.in: Regenerate.
9d32d8a
9d32d8a
--- gcc/config/elfos.h.jj	2009-04-14 15:51:24.000000000 +0200
9d32d8a
+++ gcc/config/elfos.h	2009-07-23 09:25:46.000000000 +0200
9d32d8a
@@ -289,24 +289,37 @@ see the files COPYING3 and COPYING.RUNTI
9d32d8a
 
9d32d8a
 /* Write the extra assembler code needed to declare an object properly.  */
9d32d8a
 
9d32d8a
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)		\
9d32d8a
-  do								\
9d32d8a
-    {								\
9d32d8a
-      HOST_WIDE_INT size;					\
9d32d8a
-								\
9d32d8a
-      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");		\
9d32d8a
-								\
9d32d8a
-      size_directive_output = 0;				\
9d32d8a
-      if (!flag_inhibit_size_directive				\
9d32d8a
-	  && (DECL) && DECL_SIZE (DECL))			\
9d32d8a
-	{							\
9d32d8a
-	  size_directive_output = 1;				\
9d32d8a
-	  size = int_size_in_bytes (TREE_TYPE (DECL));		\
9d32d8a
-	  ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);		\
9d32d8a
-	}							\
9d32d8a
-								\
9d32d8a
-      ASM_OUTPUT_LABEL (FILE, NAME);				\
9d32d8a
-    }								\
9d32d8a
+#ifdef HAVE_GAS_GNU_UNIQUE_OBJECT
9d32d8a
+#define USE_GNU_UNIQUE_OBJECT 1
9d32d8a
+#else
9d32d8a
+#define USE_GNU_UNIQUE_OBJECT 0
9d32d8a
+#endif
9d32d8a
+
9d32d8a
+#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
9d32d8a
+  do									\
9d32d8a
+    {									\
9d32d8a
+      HOST_WIDE_INT size;						\
9d32d8a
+									\
9d32d8a
+      /* For template static data member instantiations or		\
9d32d8a
+	 inline fn local statics, use gnu_unique_object so that		\
9d32d8a
+	 they will be combined even under RTLD_LOCAL.  */		\
9d32d8a
+      if (USE_GNU_UNIQUE_OBJECT						\
9d32d8a
+	  && !DECL_ARTIFICIAL (DECL) && DECL_ONE_ONLY (DECL))		\
9d32d8a
+	ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "gnu_unique_object");	\
9d32d8a
+      else								\
9d32d8a
+	ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");		\
9d32d8a
+									\
9d32d8a
+      size_directive_output = 0;					\
9d32d8a
+      if (!flag_inhibit_size_directive					\
9d32d8a
+	  && (DECL) && DECL_SIZE (DECL))				\
9d32d8a
+	{								\
9d32d8a
+	  size_directive_output = 1;					\
9d32d8a
+	  size = int_size_in_bytes (TREE_TYPE (DECL));			\
9d32d8a
+	  ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);			\
9d32d8a
+	}								\
9d32d8a
+									\
9d32d8a
+      ASM_OUTPUT_LABEL (FILE, NAME);					\
9d32d8a
+    }									\
9d32d8a
   while (0)
9d32d8a
 
9d32d8a
 /* Output the size directive for a decl in rest_of_decl_compilation
9d32d8a
--- gcc/configure.ac.jj	2009-03-28 09:53:59.000000000 +0100
9d32d8a
+++ gcc/configure.ac	2009-07-23 09:25:46.000000000 +0200
9d32d8a
@@ -3299,6 +3299,12 @@ gcc_GAS_CHECK_FEATURE([.lcomm with align
9d32d8a
 [AC_DEFINE(HAVE_GAS_LCOMM_WITH_ALIGNMENT, 1,
9d32d8a
   [Define if your assembler supports .lcomm with an alignment field.])])
9d32d8a
 
9d32d8a
+gcc_GAS_CHECK_FEATURE([gnu_unique_object], gcc_cv_as_gnu_unique_object,
9d32d8a
+ [elf,2,19,52],,
9d32d8a
+[.type foo, @gnu_unique_object],,
9d32d8a
+[AC_DEFINE(HAVE_GAS_GNU_UNIQUE_OBJECT, 1,
9d32d8a
+  [Define if your assembler supports @gnu_unique_object.])])
9d32d8a
+
9d32d8a
 AC_CACHE_CHECK([assembler for tolerance to line number 0],
9d32d8a
  [gcc_cv_as_line_zero],
9d32d8a
  [gcc_cv_as_line_zero=no
9d32d8a
--- gcc/configure.jj	2009-03-28 09:53:37.000000000 +0100
9d32d8a
+++ gcc/configure	2009-07-23 09:26:52.000000000 +0200
9d32d8a
@@ -24288,6 +24288,44 @@ _ACEOF
9d32d8a
 
9d32d8a
 fi
9d32d8a
 
9d32d8a
+echo "$as_me:$LINENO: checking assembler for gnu_unique_object" >&5
9d32d8a
+echo $ECHO_N "checking assembler for gnu_unique_object... $ECHO_C" >&6
9d32d8a
+if test "${gcc_cv_as_gnu_unique_object+set}" = set; then
9d32d8a
+  echo $ECHO_N "(cached) $ECHO_C" >&6
9d32d8a
+else
9d32d8a
+  gcc_cv_as_gnu_unique_object=no
9d32d8a
+    if test $in_tree_gas = yes; then
9d32d8a
+    if test $in_tree_gas_is_elf = yes \
9d32d8a
+  && test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 19 \) \* 1000 + 52`
9d32d8a
+  then gcc_cv_as_gnu_unique_object=yes
9d32d8a
+fi
9d32d8a
+  elif test x$gcc_cv_as != x; then
9d32d8a
+    echo '.type foo, @gnu_unique_object' > conftest.s
9d32d8a
+    if { ac_try='$gcc_cv_as  -o conftest.o conftest.s >&5'
9d32d8a
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
9d32d8a
+  (eval $ac_try) 2>&5
9d32d8a
+  ac_status=$?
9d32d8a
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
9d32d8a
+  (exit $ac_status); }; }
9d32d8a
+    then
9d32d8a
+	gcc_cv_as_gnu_unique_object=yes
9d32d8a
+    else
9d32d8a
+      echo "configure: failed program was" >&5
9d32d8a
+      cat conftest.s >&5
9d32d8a
+    fi
9d32d8a
+    rm -f conftest.o conftest.s
9d32d8a
+  fi
9d32d8a
+fi
9d32d8a
+echo "$as_me:$LINENO: result: $gcc_cv_as_gnu_unique_object" >&5
9d32d8a
+echo "${ECHO_T}$gcc_cv_as_gnu_unique_object" >&6
9d32d8a
+if test $gcc_cv_as_gnu_unique_object = yes; then
9d32d8a
+
9d32d8a
+cat >>confdefs.h <<\_ACEOF
9d32d8a
+#define HAVE_GAS_GNU_UNIQUE_OBJECT 1
9d32d8a
+_ACEOF
9d32d8a
+
9d32d8a
+fi
9d32d8a
+
9d32d8a
 echo "$as_me:$LINENO: checking assembler for tolerance to line number 0" >&5
9d32d8a
 echo $ECHO_N "checking assembler for tolerance to line number 0... $ECHO_C" >&6
9d32d8a
 if test "${gcc_cv_as_line_zero+set}" = set; then
9d32d8a
--- gcc/config.in.jj	2009-02-16 22:48:20.000000000 +0100
9d32d8a
+++ gcc/config.in	2009-07-23 09:26:56.000000000 +0200
9d32d8a
@@ -845,6 +845,12 @@
9d32d8a
 #endif
9d32d8a
 
9d32d8a
 
9d32d8a
+/* Define if your assembler supports @gnu_unique_object. */
9d32d8a
+#ifndef USED_FOR_TARGET
9d32d8a
+#undef HAVE_GAS_GNU_UNIQUE_OBJECT
9d32d8a
+#endif
9d32d8a
+
9d32d8a
+
9d32d8a
 /* Define if your assembler and linker support .hidden. */
9d32d8a
 #undef HAVE_GAS_HIDDEN
9d32d8a