aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-12-14 02:26:47 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2010-12-14 01:26:47 +0000
commit3a9ed12a583c79068fbd60f1314bed397f79d25f (patch)
treee215be0c22fe0dc069251dbbbf8813c08b9d5588
parent24b005606a8febb541750b14176cf891c793c6e6 (diff)
downloadgcc-3a9ed12a583c79068fbd60f1314bed397f79d25f.zip
gcc-3a9ed12a583c79068fbd60f1314bed397f79d25f.tar.gz
gcc-3a9ed12a583c79068fbd60f1314bed397f79d25f.tar.bz2
This time really commit PR middle-end/45388
This time really commit 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. From-SVN: r167781
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/cp/decl2.c6
-rw-r--r--gcc/ipa.c30
3 files changed, 34 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02a21a0..9b20492 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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,
@@ -52,13 +59,6 @@
(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
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 468c904..0c64a5d 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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),
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 5f39904..bc73afa 100644
--- 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);
}
}