This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: varpool/constpool bug
- From: Nathan Sidwell <nathan at acm dot org>
- To: Jeff Law <law at redhat dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 23 Dec 2015 09:48:38 -0500
- Subject: Re: varpool/constpool bug
- Authentication-results: sourceware.org; auth=none
- References: <56758A2A dot 4090206 at acm dot org> <567856CE dot 90908 at redhat dot com>
On 12/21/15 14:45, Jeff Law wrote:
With some kind of comment in decl_in_symtab_p indicating why we need to check
and filter on !DECL_IN_CONSTANT_POOL this is OK.
Done, thanks. (I half guessed HPPA might be such a port :)
nathan
2015-12-23 Nathan Sidwell <nathan@acm.org>
gcc/
* alias.c (compare_base_decls): Simplify in-symtab check.
* cgraph.h (decl_in_symtab_p): Check DECL_IN_CONSTANT_POOL.
testsuite/
* gcc.dg/alias-15.c: New.
Index: alias.c
===================================================================
--- alias.c (revision 231927)
+++ alias.c (working copy)
@@ -2038,13 +2038,12 @@ compare_base_decls (tree base1, tree bas
if (base1 == base2)
return 1;
- bool in_symtab1 = decl_in_symtab_p (base1);
- bool in_symtab2 = decl_in_symtab_p (base2);
-
/* Declarations of non-automatic variables may have aliases. All other
decls are unique. */
- if (in_symtab1 != in_symtab2 || !in_symtab1)
+ if (!decl_in_symtab_p (base1)
+ || !decl_in_symtab_p (base2))
return 0;
+
ret = symtab_node::get_create (base1)->equal_address_to
(symtab_node::get_create (base2), true);
if (ret == 2)
Index: cgraph.h
===================================================================
--- cgraph.h (revision 231927)
+++ cgraph.h (working copy)
@@ -2294,13 +2294,19 @@ symtab_node::real_symbol_p (void)
}
/* Return true if DECL should have entry in symbol table if used.
- Those are functions and static & external veriables*/
+ Those are functions and static & external non-constpool variables.
+ We do not expect constant pool variables in the varpool, as they're
+ not related to other variables, and simply lazily inserting them
+ using the regular interface results in varpool thinking they are
+ externally provided -- which results in erroneous assembly emission
+ as an undefined decl. */
static inline bool
decl_in_symtab_p (const_tree decl)
{
return (TREE_CODE (decl) == FUNCTION_DECL
|| (TREE_CODE (decl) == VAR_DECL
+ && !DECL_IN_CONSTANT_POOL (decl)
&& (TREE_STATIC (decl) || DECL_EXTERNAL (decl))));
}
Index: testsuite/gcc.dg/alias-15.c
===================================================================
--- testsuite/gcc.dg/alias-15.c (revision 0)
+++ testsuite/gcc.dg/alias-15.c (working copy)
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O2 -fdump-ipa-cgraph" } */
+
+/* RTL-level CSE shouldn't introduce LCO (for the string) into varpool */
+char *p;
+
+void foo ()
+{
+ p = "abc\n";
+
+ while (*p != '\n')
+ p++;
+}
+
+/* { dg-final { scan-ipa-dump-not "LC0" "cgraph" } } */