OSDN Git Service

* config/i386/i386.md (pro_epilogue_adjust_stack_1) <TYPE_ALU>: Assert
[pf3gnuchains/gcc-fork.git] / gcc / config / elfos.h
index 9aa2497..6818f66 100644 (file)
@@ -1,14 +1,14 @@
 /* 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
-   Free Software Foundation, Inc.
+   Copyright (C) 1991, 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004,
+   2007, 2009, 2010 Free Software Foundation, Inc.
    Based on svr4.h contributed by Ron Guilmette (rfg@netcom.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)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GCC is distributed in the hope that it will be useful,
@@ -16,10 +16,14 @@ 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.  */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
 
 #define TARGET_OBJFMT_CPP_BUILTINS()           \
   do                                           \
@@ -285,24 +289,39 @@ Boston, MA 02110-1301, USA.  */
 
 /* 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
@@ -499,3 +518,18 @@ Boston, MA 02110-1301, USA.  */
         fprintf ((FILE), "\"\n");                                      \
     }                                                                  \
   while (0)
+
+/* Allow the use of the -frecord-gcc-switches switch via the
+   elf_record_gcc_switches function defined in varasm.c.  */
+#undef  TARGET_ASM_RECORD_GCC_SWITCHES
+#define TARGET_ASM_RECORD_GCC_SWITCHES elf_record_gcc_switches
+
+/* A C statement (sans semicolon) to output to the stdio stream STREAM
+   any text necessary for declaring the name of an external symbol
+   named NAME which is referenced in this compilation but not defined.
+   It is needed to properly support non-default visibility.  */
+
+#ifndef ASM_OUTPUT_EXTERNAL
+#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
+  default_elf_asm_output_external (FILE, DECL, NAME)
+#endif