OSDN Git Service

This time really commit
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Dec 2010 01:26:47 +0000 (01:26 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Dec 2010 01:26:47 +0000 (01:26 +0000)
PR middle-end/45388
* decl2.c (start_objects): Do not generate collect2 recognicable name
for static ctor.
* ipa.c (cgraph_build_static_cdtor_1): Break out from ... ; add FINAL parameter.
(cgraph_build_static_cdtor): ... here.
(build_cdtor): Use cgraph_build_static_cdtor_1.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167781 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cp/decl2.c
gcc/ipa.c

index 02a21a0..9b20492 100644 (file)
@@ -1,3 +1,10 @@
+2010-12-13  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/45388
+       * ipa.c (cgraph_build_static_cdtor_1): Break out from ... ; add FINAL parameter.
+       (cgraph_build_static_cdtor): ... here.
+       (build_cdtor): Use cgraph_build_static_cdtor_1.
+
 2010-12-13  Joseph Myers  <joseph@codesourcery.com>
 
        * config/m32c/m32c.h (ENDFILE_SPEC, LINK_SPEC, SIZE_TYPE,
        (emit_note_insn_var_location): Remove ENABLE_RTL_CHECKING verification.
        (vt_emit_notes): Don't initialize and destroy emitted_notes.
 
-2010-12-13  Jan Hubicka  <jh@suse.cz>
-
-       PR middle-end/45388
-       * ipa.c (cgraph_build_static_cdtor_1): Break out from ... ; add FINAL parameter.
-       (cgraph_build_static_cdtor): ... here.
-       (build_cdtor): Use cgraph_build_static_cdtor_1.
-
 2010-12-13  Nathan Froyd  <froydnj@codesourcery.com>
 
        PR target/46040
index 468c904..0c64a5d 100644 (file)
@@ -2691,7 +2691,7 @@ start_objects (int method_type, int initp)
 {
   tree body;
   tree fndecl;
-  char type[10];
+  char type[14];
 
   /* Make ctor or dtor function.  METHOD_TYPE may be 'I' or 'D'.  */
 
@@ -2705,10 +2705,10 @@ start_objects (int method_type, int initp)
       joiner = '_';
 #endif
 
-      sprintf (type, "%c%c%.5u", method_type, joiner, initp);
+      sprintf (type, "sub_%c%c%.5u", method_type, joiner, initp);
     }
   else
-    sprintf (type, "%c", method_type);
+    sprintf (type, "sub_%c", method_type);
 
   fndecl = build_lang_decl (FUNCTION_DECL,
                            get_file_function_name (type),
index 5f39904..bc73afa 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -1496,10 +1496,13 @@ struct ipa_opt_pass_d pass_ipa_profile =
 /* Generate and emit a static constructor or destructor.  WHICH must
    be one of 'I' (for a constructor) or 'D' (for a destructor).  BODY
    is a STATEMENT_LIST containing GENERIC statements.  PRIORITY is the
-   initialization priority for this constructor or destructor.  */
+   initialization priority for this constructor or destructor. 
 
-void
-cgraph_build_static_cdtor (char which, tree body, int priority)
+   FINAL specify whether the externally visible name for collect2 should
+   be produced. */
+
+static void
+cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final)
 {
   static int counter = 0;
   char which_buf[16];
@@ -1508,7 +1511,12 @@ cgraph_build_static_cdtor (char which, tree body, int priority)
   /* The priority is encoded in the constructor or destructor name.
      collect2 will sort the names and arrange that they are called at
      program startup.  */
-  sprintf (which_buf, "%c_%.5d_%d", which, priority, counter++);
+  if (final)
+    sprintf (which_buf, "%c_%.5d_%d", which, priority, counter++);
+  else
+  /* Proudce sane name but one not recognizable by collect2, just for the
+     case we fail to inline the function.  */
+    sprintf (which_buf, "sub_%c_%.5d_%d", which, priority, counter++);
   name = get_file_function_name (which_buf);
 
   decl = build_decl (input_location, FUNCTION_DECL, name,
@@ -1528,7 +1536,7 @@ cgraph_build_static_cdtor (char which, tree body, int priority)
   DECL_ARTIFICIAL (decl) = 1;
   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
   DECL_SAVED_TREE (decl) = body;
-  if (!targetm.have_ctors_dtors)
+  if (!targetm.have_ctors_dtors && final)
     {
       TREE_PUBLIC (decl) = 1;
       DECL_PRESERVE_P (decl) = 1;
@@ -1563,6 +1571,16 @@ cgraph_build_static_cdtor (char which, tree body, int priority)
   current_function_decl = NULL;
 }
 
+/* Generate and emit a static constructor or destructor.  WHICH must
+   be one of 'I' (for a constructor) or 'D' (for a destructor).  BODY
+   is a STATEMENT_LIST containing GENERIC statements.  PRIORITY is the
+   initialization priority for this constructor or destructor.  */
+
+void
+cgraph_build_static_cdtor (char which, tree body, int priority)
+{
+  cgraph_build_static_cdtor_1 (which, body, priority, false);
+}
 
 /* A vector of FUNCTION_DECLs declared as static constructors.  */
 static VEC(tree, heap) *static_ctors;
@@ -1648,7 +1666,7 @@ build_cdtor (bool ctor_p, VEC (tree, heap) *cdtors)
       gcc_assert (body != NULL_TREE);
       /* Generate a function to call all the function of like
         priority.  */
-      cgraph_build_static_cdtor (ctor_p ? 'I' : 'D', body, priority);
+      cgraph_build_static_cdtor_1 (ctor_p ? 'I' : 'D', body, priority, true);
     }
 }