Summary: | [4.0 regression] template instantation omits static data members | ||
---|---|---|---|
Product: | gcc | Reporter: | Michael Elizabeth Chastain <mec.gnu> |
Component: | c++ | Assignee: | Andrew Pinski <pinskia> |
Status: | RESOLVED FIXED | ||
Severity: | critical | CC: | gcc-bugs, zack+srcbugz |
Priority: | P1 | Keywords: | patch, wrong-code |
Version: | 4.0.0 | ||
Target Milestone: | 4.0.0 | ||
Host: | i686-pc-linux-gnu | Target: | i686-pc-linux-gnu |
Build: | i686-pc-linux-gnu | Known to work: | |
Known to fail: | Last reconfirmed: | 2004-05-29 02:52:33 | |
Bug Depends on: | |||
Bug Blocks: | 15546 | ||
Attachments: |
Test program
assembly code, last good compiler, 2004-05-19 01:00:00 UTC Generated code, first bad compiler, 2004-05-19 02:00:00 UTC |
Description
Michael Elizabeth Chastain
2004-05-29 02:21:28 UTC
Created attachment 6424 [details]
Test program
Compile with: "gcc -S -gstabs+".
Look for gnu_obj_2<int>::my_static and gnu_obj_2<long>::my_static in the
generated code.
Created attachment 6425 [details]
assembly code, last good compiler, 2004-05-19 01:00:00 UTC
Generated assembly code with "gcc -S -gstabs+ template-static.cc".
This is with the last good compiler.
Created attachment 6426 [details]
Generated code, first bad compiler, 2004-05-19 02:00:00 UTC
Code generated with "gcc -S -gstabs+ template-static.cc".
This is with the first bad compiler.
Confirmed, I will try to figure out what is going on but if Zack beats me, I would not be made. mark_decl_referenced is being called for the variable. The problem is that decl is not finalized before being marked as needed. I know that rest_of_decl_compilation is being called for the decl but not assemble_variable for some reason. I have not checked how it was done before Zack's patch. The difference between before and after is that DECL_EXTERNAL (decl) in rest_of_decl_compilation is true after but false before which causes it not be outputted. Ignore that last comment, I was wrong, it does not even get to rest_of_decl_compilation for that decl. Okay, wrapup_global_declarations checks TREE_SYMBOL_REFERENCED of DECL_ASSEMBLER_NAME of the decl which is where the problem is. This should work (I have tested it on the testcase though), I have not bootstrapped and tested it yet: Index: toplev.c =============================================================== ==== RCS file: /cvs/gcc/gcc/gcc/toplev.c,v retrieving revision 1.899 diff -u -p -r1.899 toplev.c --- toplev.c 30 May 2004 18:32:27 -0000 1.899 +++ toplev.c 2 Jun 2004 00:41:09 -0000 @@ -1455,16 +1455,17 @@ wrapup_global_declarations (tree *vec, i if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) { + struct cgraph_varpool_node *node; bool needed = 1; + node = cgraph_varpool_node (decl); - if (flag_unit_at_a_time - && cgraph_varpool_node (decl)->finalized) + if (node && node->finalized) needed = 0; else if ((flag_unit_at_a_time && !cgraph_global_info_ready) && (TREE_USED (decl) || TREE_USED (DECL_ASSEMBLER_NAME (decl)))) /* needed */; - else if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) + else if (node && node->needed) /* needed */; else if (DECL_COMDAT (decl)) needed = 0; Mine, I posted a patch: <http://gcc.gnu.org/ml/gcc-patches/2004-06/msg00088.html>. Andrew, this patch was approved by Mark, I assume you just forgot to apply and close the bug... Subject: Bug 15721 CVSROOT: /cvs/gcc Module name: gcc Changes by: pinskia@gcc.gnu.org 2004-06-19 16:17:01 Modified files: gcc : ChangeLog toplev.c Log message: 2004-06-19 Andrew Pinski <apinski@apple.com> PR c++/15721 * toplev.c (wrapup_global_declarations): Do not check TREE_SYMBOL_REFERENCED of the DECL_ASSEMBLER_NAME but check cgraph_varpool_node's needed field. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.4040&r2=2.4041 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/toplev.c.diff?cvsroot=gcc&r1=1.905&r2=1.906 No I was just testing it again. Fixed now. Subject: Re: [3.5 regression] template instantation omits static data members It works for me. Thanks, Michael C |