Bug 41611 - [4.5 Regression] guard variable is emitted even when the guarded symbol isn't
Summary: [4.5 Regression] guard variable is emitted even when the guarded symbol isn't
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.5.0
: P1 normal
Target Milestone: 4.5.0
Assignee: Jason Merrill
URL:
Keywords: wrong-code
: 42171 (view as bug list)
Depends on:
Blocks:
 
Reported: 2009-10-06 20:20 UTC by Zdenek Sojka
Modified: 2009-12-04 18:22 UTC (History)
9 users (show)

See Also:
Host: x86_64-pc-linux-gnu
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2009-12-01 19:48:11


Attachments
preprocessed source (116 bytes, text/plain)
2009-10-06 20:22 UTC, Zdenek Sojka
Details
original testcase reproducing crash (preprocessed files) (385 bytes, application/octet-stream)
2009-10-06 20:28 UTC, Zdenek Sojka
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Zdenek Sojka 2009-10-06 20:20:31 UTC
Continuing from http://gcc.gnu.org/ml/gcc-help/2009-10/msg00087.html

When compiling the following code:
g++ test.cpp -o test.o -c -save-temps
---- test.cpp -------------
struct A {
	static int Init()
	{
		static int &i = *new int();
		return i;
	}
};
-----------------------

Generated file contains symbol _ZGVZN1A4InitEvE1i (guard variable for i), but not _ZZN1A4InitEvE1i (guarded variable i). Guard variable shouldn't be generated in this case. 
Since sometimes between 20090611 and 20090618, guard and guarded variables are in the same section group. Linker then (may) generate file with undefined _ZZN1A4InitEvE1i, which causes crash when this variable is accessed. (I hope I understood things correctly)

Tested 3.3.6, 3.4.6, 4.1.2, 4.2.4, 4.3.4, 4.4.1, 4.5
Symbol is emitted everywhere, but only in 4.5 it causes crash.
Comment 1 Zdenek Sojka 2009-10-06 20:22:20 UTC
Created attachment 18730 [details]
preprocessed source
Comment 2 Zdenek Sojka 2009-10-06 20:28:11 UTC
Created attachment 18731 [details]
original testcase reproducing crash (preprocessed files)

To reproduce the crash, use: (order of *.ii is important)
g++ file.ii main.ii -o a.out && ./a.out
Comment 3 David Edelsohn 2009-10-06 23:28:16 UTC
Yep
Comment 4 Andrew Pinski 2009-10-23 23:46:53 UTC
This really should be a P1, I ran into this with a benchmark we have here internally.
Comment 5 Andrew Pinski 2009-10-23 23:49:17 UTC
I almost want to say it was caused by:
2009-06-15  Rafael Avila de Espindola  <espindola@google.com>
        
        * cp-objcp-common.h (LANG_HOOKS_COMDAT_GROUP): Remove.
        * cp-tree.h (cxx_comdat_group): Change signature.
        * decl.c (duplicate_decls): Use DECL_COMDAT_GROUP.
        (cxx_comdat_group): Change signature.
        * decl2.c (comdat_linkage, maybe_make_one_only): Update call to
        make_decl_one_only.
        (constrain_visibility, get_guard): Use DECL_COMDAT_GROUP.
        * method.c (use_thunk): Update call to make_decl_one_only.
        * optimize.c (maybe_clone_body): Use DECL_COMDAT_GROUP
Comment 6 H.J. Lu 2009-11-25 10:10:56 UTC
Gcc 4.5 generates:

---
       .file   "pr41611.cc"
        .weak   _ZGVZN1A4InitEvE1i
        .section        .bss._ZGVZN1A4InitEvE1i,"awG",@nobits,_ZZN1A4InitEvE1i,comdat
        .align 8
        .type   _ZGVZN1A4InitEvE1i, @object
        .size   _ZGVZN1A4InitEvE1i, 8
_ZGVZN1A4InitEvE1i:
        .zero   8
----

It uses "_ZZN1A4InitEvE1i" for signature. Gcc should

1. Use _ZGVZN1A4InitEvE1i for signature. Or
2. Generate in the same assembly file where _ZZN1A4InitEvE1i is defined.
Comment 7 Andrew Pinski 2009-11-25 21:01:15 UTC
*** Bug 42171 has been marked as a duplicate of this bug. ***
Comment 8 Richard Biener 2009-12-01 12:15:09 UTC
Re-confirmed.  Rafael - as you seem to have caused this can you look into it?
Comment 9 Jason Merrill 2009-12-01 21:58:18 UTC
Subject: Bug 41611

Author: jason
Date: Tue Dec  1 21:58:04 2009
New Revision: 154885

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=154885
Log:
	PR c++/41611
	* decl2.c (get_guard): Copy DECL_COMDAT.
	(comdat_linkage): Set DECL_COMDAT unconditionally.

Added:
    trunk/gcc/testsuite/g++.dg/abi/guard1.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/decl2.c
    trunk/gcc/testsuite/ChangeLog

Comment 10 Jason Merrill 2009-12-02 13:50:40 UTC
Fixed.
Comment 11 Jason Merrill 2009-12-04 00:26:50 UTC
Subject: Bug 41611

Author: jason
Date: Fri Dec  4 00:26:35 2009
New Revision: 154965

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=154965
Log:
	PR c++/41611
	* decl2.c (get_guard): Don't use the same comdat group as the decl.

Added:
    trunk/gcc/testsuite/g++.dg/abi/guard2.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/decl2.c
    trunk/gcc/testsuite/ChangeLog

Comment 12 hjl@gcc.gnu.org 2009-12-11 23:38:08 UTC
Subject: Bug 41611

Author: hjl
Date: Fri Dec 11 23:36:24 2009
New Revision: 155184

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=155184
Log:
Backport testcases from trunk.

2009-12-11  H.J. Lu  <hongjiu.lu@intel.com>

	Backport from mainline:
	2009-12-11  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42225
	* g++.dg/template/typedef24.C: New test.
	* g++.dg/template/typedef25.C: New test.

	2009-12-11  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42251
	* g++.dg/template/const3.C: New test.

	2009-12-10  Jakub Jelinek  <jakub@redhat.com>

	PR c++/42317
	* g++.dg/opt/dtor2.C: New test.
	* g++.dg/opt/dtor2.h: New file.
	* g++.dg/opt/dtor2-aux.cc: New file.

	2009-12-10  Jan Hubicka  <jh@suse.cz>

	PR middle-end/42110
	* g++.dg/torture/pr42110.C: new file.

	2009-12-07  Jakub Jelinek  <jakub@redhat.com>

	PR debug/42244
	* gcc.dg/debug/pr42244.c: New test.

	2009-12-04  David Daney  <ddaney@caviumnetworks.com>

	PR rtl-optimization/42164
	* gcc.c-torture/compile/pr42164.c: New test.

	2009-12-03  Jason Merrill  <jason@redhat.com>

	PR c++/41611
	* g++.dg/abi/guard2.C: New.

	2009-12-03  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42217
	* g++.dg/other/bitfield4.C: New test.

	2009-12-03  Jakub Jelinek  <jakub@redhat.com>

	PR c++/42256
	* g++.dg/inherit/thunk11.C: New test.
	* g++.dg/inherit/thunk11.h: New file.
	* g++.dg/inherit/thunk11-aux.cc: New file.

	2009-12-01  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42237
	* gcc.c-torture/compile/pr42237.c: New test.

	2009-12-01  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/42057
	* g++.dg/parse/crash54.C: New.

	2009-11-30  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/42196
	* gcc.c-torture/compile/pr42196-1.c: New test.
	* gcc.c-torture/compile/pr42196-2.c: New test.
	* gcc.c-torture/compile/pr42196-3.c: New test.

	2009-11-30  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42069
	* g++.dg/template/typedef23.C: New test.

	2009-11-29  H.J. Lu  <hongjiu.lu@intel.com>

	PR tree-optimization/41961
	* g++.dg/tree-ssa/pr41961.C: New.

	2009-11-29  Ira Rosen  <irar@il.ibm.com>

	PR tree-optimization/42193
	* gcc.dg/vect/pr42193.c: New test.

	2009-11-28  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42183
	* g++.dg/torture/pr42183.C: New testcase.

	2009-11-27  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/42006
	* gcc.c-torture/execute/pr42006.c: New test.

	2009-11-27  Michael Matz  <matz@suse.de>

	PR rtl-optimization/42084
	* gcc.dg/pr42084.c: New test.

	2009-11-27  Michael Matz  <matz@suse.de>

	PR c++/41906
	* g++.dg/tree-ssa/pr41906.C: New testcase.

	2009-11-26  Michael Matz  <matz@suse.de>

	PR tree-optimization/41905
	* g++.dg/tree-ssa/pr41905.C: New testcase.

	2009-11-24  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42142
	* gcc.c-torture/execute/pr42142.c: New testcase.

	2009-11-24  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42154
	* gcc.c-torture/execute/pr42154.c: New test.

	2009-11-21  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/42025
	* gcc.c-torture/compile/pr42025-1.c: New test.
	* gcc.c-torture/compile/pr42025-2.c: New test.

	2009-11-21  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/42078
	* gcc.dg/pr42078.c: New test.

Added:
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/abi/guard2.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/abi/guard2.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/inherit/thunk11.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/inherit/thunk11.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/inherit/thunk11.h
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/inherit/thunk11.h
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/opt/dtor2-aux.cc
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/opt/dtor2-aux.cc
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/opt/dtor2.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/opt/dtor2.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/opt/dtor2.h
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/opt/dtor2.h
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/other/bitfield4.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/other/bitfield4.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/parse/crash54.C
      - copied unchanged from r155172, trunk/gcc/testsuite/g++.dg/parse/crash54.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/const3.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/template/const3.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef23.C
      - copied unchanged from r155181, trunk/gcc/testsuite/g++.dg/template/typedef23.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef24.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/template/typedef24.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef25.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/template/typedef25.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42110.C
      - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/torture/pr42110.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42183.C
      - copied unchanged from r155181, trunk/gcc/testsuite/g++.dg/torture/pr42183.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/tree-ssa/pr41905.C
      - copied unchanged from r155182, trunk/gcc/testsuite/g++.dg/tree-ssa/pr41905.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/tree-ssa/pr41906.C
      - copied unchanged from r155182, trunk/gcc/testsuite/g++.dg/tree-ssa/pr41906.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/tree-ssa/pr41961.C
      - copied unchanged from r155181, trunk/gcc/testsuite/g++.dg/tree-ssa/pr41961.C
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42025-1.c
      - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/compile/pr42025-1.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42025-2.c
      - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/compile/pr42025-2.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42164.c
      - copied unchanged from r155170, trunk/gcc/testsuite/gcc.c-torture/compile/pr42164.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42196-1.c
      - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/compile/pr42196-1.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42196-2.c
      - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/compile/pr42196-2.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42196-3.c
      - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/compile/pr42196-3.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42237.c
      - copied unchanged from r155171, trunk/gcc/testsuite/gcc.c-torture/compile/pr42237.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42006.c
      - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/execute/pr42006.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42142.c
      - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/execute/pr42142.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42154.c
      - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/execute/pr42154.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/debug/pr42244.c
      - copied unchanged from r155170, trunk/gcc/testsuite/gcc.dg/debug/pr42244.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42078.c
      - copied unchanged from r155182, trunk/gcc/testsuite/gcc.dg/pr42078.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42084.c
      - copied unchanged from r155182, trunk/gcc/testsuite/gcc.dg/pr42084.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/vect/pr42193.c
      - copied unchanged from r155181, trunk/gcc/testsuite/gcc.dg/vect/pr42193.c
Modified:
    branches/gcc-4_4-branch/gcc/testsuite/ChangeLog