Index: gcc/gcc/config/elfos.h |
diff --git a/gcc/gcc/config/elfos.h b/gcc/gcc/config/elfos.h |
index 2d818d145d555a1a837b742409e1c76009e09439..6818f6600fe2069dcf7878d357b1513c3eb9cbfb 100644 |
--- a/gcc/gcc/config/elfos.h |
+++ b/gcc/gcc/config/elfos.h |
@@ -1,7 +1,7 @@ |
/* elfos.h -- operating system specific defines to be used when |
targeting GCC for some generic ELF system |
Copyright (C) 1991, 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, |
- 2007, 2009 Free Software Foundation, Inc. |
+ 2007, 2009, 2010 Free Software Foundation, Inc. |
Based on svr4.h contributed by Ron Guilmette (rfg@netcom.com). |
This file is part of GCC. |
@@ -289,24 +289,39 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
/* Write the extra assembler code needed to declare an object properly. */ |
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
- do \ |
- { \ |
- HOST_WIDE_INT size; \ |
- \ |
- ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ |
- \ |
- size_directive_output = 0; \ |
- if (!flag_inhibit_size_directive \ |
- && (DECL) && DECL_SIZE (DECL)) \ |
- { \ |
- size_directive_output = 1; \ |
- size = int_size_in_bytes (TREE_TYPE (DECL)); \ |
- ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ |
- } \ |
- \ |
- ASM_OUTPUT_LABEL (FILE, NAME); \ |
- } \ |
+#ifdef HAVE_GAS_GNU_UNIQUE_OBJECT |
+#define USE_GNU_UNIQUE_OBJECT 1 |
+#else |
+#define USE_GNU_UNIQUE_OBJECT 0 |
+#endif |
+ |
+#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
+ do \ |
+ { \ |
+ HOST_WIDE_INT size; \ |
+ \ |
+ /* For template static data member instantiations or \ |
+ inline fn local statics and their guard variables, use \ |
+ gnu_unique_object so that they will be combined even under \ |
+ RTLD_LOCAL. Don't use gnu_unique_object for typeinfo, \ |
+ vtables and other read-only artificial decls. */ \ |
+ if (USE_GNU_UNIQUE_OBJECT && DECL_ONE_ONLY (DECL) \ |
+ && (!DECL_ARTIFICIAL (DECL) || !TREE_READONLY (DECL))) \ |
+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "gnu_unique_object"); \ |
+ else \ |
+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ |
+ \ |
+ size_directive_output = 0; \ |
+ if (!flag_inhibit_size_directive \ |
+ && (DECL) && DECL_SIZE (DECL)) \ |
+ { \ |
+ size_directive_output = 1; \ |
+ size = int_size_in_bytes (TREE_TYPE (DECL)); \ |
+ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ |
+ } \ |
+ \ |
+ ASM_OUTPUT_LABEL (FILE, NAME); \ |
+ } \ |
while (0) |
/* Output the size directive for a decl in rest_of_decl_compilation |