aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2005-03-28 16:10:05 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2005-03-28 14:10:05 +0000
commit5c55c2e8ca74bc7d7aeb7ecf764972f82464b481 (patch)
tree354aee552e84dfee7c7daada9782277acd4a1880 /gcc
parentc7f599d0996caab1a5ba2c09cb065e053815418b (diff)
downloadgcc-5c55c2e8ca74bc7d7aeb7ecf764972f82464b481.zip
gcc-5c55c2e8ca74bc7d7aeb7ecf764972f82464b481.tar.gz
gcc-5c55c2e8ca74bc7d7aeb7ecf764972f82464b481.tar.bz2
re PR middle-end/20635 (ICE in cgraph_mark_reachable_node)
PR middle-end/20635 * varasm.c (mark_decl_referenced): Do not mark extern inline functions as needed. * compile/gcc.c-torture/compile/20050328-1.c: New testcase made by Jakub Jelinek. From-SVN: r97133
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20050328-1.c24
-rw-r--r--gcc/varasm.c6
4 files changed, 39 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33a60b1..c07d3c4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2005-03-28 Jan Hubicka <jh@suse.cz>
+ PR middle-end/20635
+ * varasm.c (mark_decl_referenced): Do not mark extern inline functions
+ as needed.
+
* tree-inline.c (estimate_num_insns_1): Use declaration to discover argument
types where possible.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 447cf20..9e7efa7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-28 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/20635
+ * compile/gcc.c-torture/compile/20050328-1.c: New testcase made
+ by Jakub Jelinek.
+
2005-03-27 Dorit Naishlos <dorit@il.ibm.com>
PR tree-optimization/20626
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050328-1.c b/gcc/testsuite/gcc.c-torture/compile/20050328-1.c
new file mode 100644
index 0000000..a68574f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20050328-1.c
@@ -0,0 +1,24 @@
+void fn1 (void *);
+void fn2 (void *);
+void foo (void);
+void bar (void);
+
+extern inline void *
+baz (void)
+{
+ return 0;
+}
+
+void
+foo (void)
+{
+ fn1 (baz ());
+ fn2 (baz ());
+}
+
+void
+bar (void)
+{
+ fn1 (baz ());
+ fn2 (baz);
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 9a04cd5..c174eb4 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1877,7 +1877,11 @@ void
mark_decl_referenced (tree decl)
{
if (TREE_CODE (decl) == FUNCTION_DECL)
- cgraph_mark_needed_node (cgraph_node (decl));
+ {
+ /* Extern inline functions don't become needed when referenced. */
+ if (!DECL_EXTERNAL (decl))
+ cgraph_mark_needed_node (cgraph_node (decl));
+ }
else if (TREE_CODE (decl) == VAR_DECL)
cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
/* else do nothing - we can get various sorts of CST nodes here,