* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
@ 2009-10-03 11:26 ` rguenth at gcc dot gnu dot org
2009-10-03 11:41 ` rguenth at gcc dot gnu dot org
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-03 11:26 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from rguenth at gcc dot gnu dot org 2009-10-03 11:26 -------
I obviously reduced into sth with ODR violations. Fixing them makes the
testcase work ok apart from producing weak symbols for
_ZN6soplex7DVectoraSERKNS_6VectorE where the non-LTO case had no such things.
Note the original sources do not contain ODR violations (at least in the
pieces that are in the reduced testcase).
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
2009-10-03 11:26 ` [Bug lto/41552] " rguenth at gcc dot gnu dot org
@ 2009-10-03 11:41 ` rguenth at gcc dot gnu dot org
2009-10-03 11:59 ` rguenth at gcc dot gnu dot org
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-03 11:41 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from rguenth at gcc dot gnu dot org 2009-10-03 11:41 -------
Ok, I have some new reduced testcases:
dvector.3.ii
------------
typedef double Real;
class Vector {
int dimen;
Real* val;
public:
Vector& operator=(const Vector& vec);
Vector(int p_dimen, Real *p_val)
: dimen(p_dimen), val(p_val) { }
int dim() const;
};
class DVector : public Vector {
public:
void reDim(int newdim);
explicit DVector(const Vector& old);
DVector& operator=(const Vector& vec) {
reDim(vec.dim());
Vector::operator=(vec);
}
};
Vector& Vector::operator=(const Vector& vec)
{
dimen = vec.dimen;
val = vec.val;
}
int Vector::dim() const { return dimen; }
DVector::DVector(const Vector& old) : Vector(0, 0)
{
*this = old;
}
void DVector::reDim(int newdim) {}
int main() {}
------------
slufactor.3.ii
---------------
typedef double Real;
class Vector {
int dimen;
Real* val;
public:
Vector& operator=(const Vector& vec);
Vector(int p_dimen, Real *p_val)
: dimen(p_dimen), val(p_val) { }
int dim() const;
};
class DVector : public Vector {
public:
void reDim(int newdim);
explicit DVector(const Vector& old);
DVector& operator=(const Vector& vec) {
reDim(vec.dim());
Vector::operator=(vec);
}
};
class SLUFactor {
DVector vec;
void solveRight (Vector& x, const Vector& b);
};
void SLUFactor::solveRight (Vector& x, const Vector& b) {
vec = b;
}
-----------
no more ODR violations and a testcase with link-time errors:
> g++ -o t slufactor.3.ii dvector.3.ii -flto -O -fPIC
/tmp/ccu9746J.lto.o: In function `_ZN7DVectorC1ERK6Vector':
cccxaZqP.o:(.text+0xa1): undefined reference to `_ZN7DVectoraSERK6Vector'
/tmp/ccu9746J.lto.o: In function `_ZN7DVectorC2ERK6Vector':
cccxaZqP.o:(.text+0xd9): undefined reference to `_ZN7DVectoraSERK6Vector'
collect2: ld returned 1 exit status
> g++ -o t dvector.3.ii slufactor.3.ii -flto -O -fPIC
works w/o -fPIC and w/o -flto.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
2009-10-03 11:26 ` [Bug lto/41552] " rguenth at gcc dot gnu dot org
2009-10-03 11:41 ` rguenth at gcc dot gnu dot org
@ 2009-10-03 11:59 ` rguenth at gcc dot gnu dot org
2009-10-03 13:20 ` rguenth at gcc dot gnu dot org
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-03 11:59 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from rguenth at gcc dot gnu dot org 2009-10-03 11:58 -------
cgraph after input_cgraph () in the broken case:
operator=/8(-1) @0xb7d34500
called by: __base_ctor /2 (1.00 per call) (can throw external) __comp_ctor /3
(1.00 per call) (can throw external)
calls:
main/1(-1) @0xb7c98d00 needed reachable externally_visible finalized
called by:
calls:
__base_ctor /2(-1) @0xb7c98e00 15 time, 14 benefit 6 size, 5 benefit needed
reachable externally_visible finalized
called by:
calls: operator=/8 (1.00 per call) (can throw external)
__comp_ctor /3(-1) @0xb7d34000 15 time, 14 benefit 6 size, 5 benefit needed
reachable externally_visible finalized
called by:
calls: operator=/8 (1.00 per call) (can throw external)
dim/6(-1) @0xb7d34300 1 time, 13 benefit 1 size, 4 benefit needed reachable
externally_visible finalized
called by: solveRight/0 (1.00 per call) (can throw external)
calls:
reDim/5(-1) @0xb7d34200 needed reachable externally_visible finalized
called by: solveRight/0 (1.00 per call) (can throw external)
calls:
operator=/4(-1) @0xb7d34100 4 time, 17 benefit 4 size, 8 benefit needed
reachable externally_visible finalized
called by: solveRight/0 (1.00 per call) (can throw external)
calls:
solveRight/0(-1) @0xb7c98f00 39 time, 15 benefit 12 size, 6 benefit needed
reachable externally_visible finalized
called by:
calls: dim/6 (1.00 per call) (can throw external) reDim/5 (1.00 per call)
(can throw external) operator=/4 (1.00 per call) (can throw external)
and in the working case:
solveRight/7(-1) @0xb7d34400 39 time, 15 benefit 12 size, 6 benefit needed
reachable externally_visible finalized
called by:
calls: dim/1 (1.00 per call) (can throw external) reDim/2 (1.00 per call)
(can throw external) operator=/0 (1.00 per call) (can throw external)
operator=/6(-1) @0xb7d34300 38 time, 14 benefit 11 size, 5 benefit needed
reachable externally_visible finalized inlinable
called by: __base_ctor /4 (1.00 per call) (can throw external) __comp_ctor /3
(1.00 per call) (can throw external)
calls: dim/1 (1.00 per call) (can throw external) reDim/2 (1.00 per call)
(can throw external) operator=/0 (1.00 per call) (can throw external)
main/5(-1) @0xb7d34200 needed reachable externally_visible finalized
called by:
calls:
__base_ctor /4(-1) @0xb7d34100 15 time, 14 benefit 6 size, 5 benefit needed
reachable externally_visible finalized
called by:
calls: operator=/6 (1.00 per call) (can throw external)
__comp_ctor /3(-1) @0xb7d34000 15 time, 14 benefit 6 size, 5 benefit needed
reachable externally_visible finalized
called by:
calls: operator=/6 (1.00 per call) (can throw external)
reDim/2(-1) @0xb7c98e00 needed reachable externally_visible finalized
called by: solveRight/7 (1.00 per call) (can throw external) operator=/6
(1.00 per call) (can throw external)
calls:
dim/1(-1) @0xb7c98d00 1 time, 13 benefit 1 size, 4 benefit needed reachable
externally_visible finalized
called by: solveRight/7 (1.00 per call) (can throw external) operator=/6
(1.00 per call) (can throw external)
calls:
operator=/0(-1) @0xb7c98f00 4 time, 17 benefit 4 size, 8 benefit needed
reachable externally_visible finalized
called by: solveRight/7 (1.00 per call) (can throw external) operator=/6
(1.00 per call) (can throw external)
calls:
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
` (2 preceding siblings ...)
2009-10-03 11:59 ` rguenth at gcc dot gnu dot org
@ 2009-10-03 13:20 ` rguenth at gcc dot gnu dot org
2009-10-04 13:47 ` rguenth at gcc dot gnu dot org
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-03 13:20 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from rguenth at gcc dot gnu dot org 2009-10-03 13:19 -------
We only have one cgraph node for _ZN7DVectoraSERK6Vector in both files,
but its decl isn't the prevailing one!? The one for the cgraph node
is LDPR_PREEMPTED_IR while the prevailing one is LDPR_PREVAILING_DEF.
It's the first one selected as LDPR_PREVAILING_DEF because of:
addressable used public static weak autoinline QI defer-output file
slufactor.3.ii line 15 col 14 align 16
vs.
addressable used public static weak autoinline QI defer-output file
dvector.3.ii line 15 col 14 align 16
so we go the DECL_WEAK path in get_resolution ().
That is, if we drop a cgraph-node for a decl (because it's not needed)
before streaming out the cgraph we should probably change the cgraph-nodes
decl flag to drop TREE_STATIC and set DECL_EXTERNAL instead. At least
we have to choose a DECL_WEAK one with a cgraph node to not run into
this PR.
Or completely defer decl merging to after we have read the cgraph so we
can better decide on what to do. We'd delay
lto_register_deferred_decls_in_symtab until after input_cgraph (not
merging the cgraph therein), and we even can read the summaries without
hitting PR41487.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
` (3 preceding siblings ...)
2009-10-03 13:20 ` rguenth at gcc dot gnu dot org
@ 2009-10-04 13:47 ` rguenth at gcc dot gnu dot org
2009-10-05 14:06 ` rguenth at gcc dot gnu dot org
2009-10-05 14:17 ` rguenth at gcc dot gnu dot org
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-04 13:47 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from rguenth at gcc dot gnu dot org 2009-10-04 13:47 -------
I have a pat^Whack.
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |rguenth at gcc dot gnu dot
|dot org |org
Status|UNCONFIRMED |ASSIGNED
Ever Confirmed|0 |1
Last reconfirmed|0000-00-00 00:00:00 |2009-10-04 13:47:15
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
` (4 preceding siblings ...)
2009-10-04 13:47 ` rguenth at gcc dot gnu dot org
@ 2009-10-05 14:06 ` rguenth at gcc dot gnu dot org
2009-10-05 14:17 ` rguenth at gcc dot gnu dot org
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-05 14:06 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from rguenth at gcc dot gnu dot org 2009-10-05 14:06 -------
Subject: Bug 41552
Author: rguenth
Date: Mon Oct 5 14:05:54 2009
New Revision: 152450
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=152450
Log:
2009-10-05 Richard Guenther <rguenther@suse.de>
PR lto/41552
PR lto/41487
* lto-symtab.c (struct lto_symtab_base_def): Remove.
(struct lto_symtab_identifier_def): Likewise.
(struct lto_symtab_decl_def): Likewise.
(struct lto_symtab_entry_def): New.
(lto_symtab_identifier_t): Rename to ...
(lto_symtab_entry_t): ... this.
(lto_symtab_decls): Remove.
(lto_symtab_base_hash): Rename to ...
(lto_symtab_entry_hash): ... this.
(lto_symtab_base_eq): Rename to ...
(lto_symtab_entry_eq): ... this.
(lto_symtab_base_marked_p): Rename to ...
(lto_symtab_entry_marked_p): ... this.
(lto_symtab_identifier_marked_p): Remove.
(lto_symtab_decl_marked_p): Likewise.
(lto_symtab_maybe_init_hash_tables): Rename to ...
(lto_symtab_maybe_init_hash_table): ... this.
(lto_symtab_set_resolution_and_file_data): Remove.
(lto_symtab_register_decl): New function.
(lto_symtab_get_identifier): Remove.
(lto_symtab_get): New function.
(lto_symtab_get_resolution): Adjust.
(lto_symtab_get_identifier_decl): Remove.
(lto_symtab_set_identifier_decl): Likewise.
(lto_symtab_merge_decl): Rename to ...
(lto_symtab_merge): ... this. Rewrite.
(lto_symtab_merge_var): Remove.
(lto_symtab_merge_fn): Likewise.
(lto_symtab_prevailing_decl): Adjust.
(lto_cgraph_replace_node): New function.
(lto_symtab_merge_decls_2): Likewise.
(lto_symtab_merge_decls_1): Likewise.
(lto_symtab_fixup_var_decls): Likewise.
(lto_symtab_resolve_symbols): Likewise.
(lto_symtab_merge_decls): Likewise.
(lto_symtab_prevailing_decl): Adjust.
(lto_symtab_get_symtab_def): Remove.
(lto_symtab_get_file_data): Likewise.
(lto_symtab_clear_resolution): Adjust.
(lto_symtab_clear_resolution): Likewise.
* lto-cgraph.c (input_edge): Do not merge cgraph nodes here.
(input_cgraph_1): Likewise.
* lto-streamer-in.c (get_resolution): Do not provide fake
symbol resolutions here.
(deferred_global_decls): Remove.
(lto_register_deferred_decls_in_symtab): Likewise.
(lto_register_var_decl_in_symtab): Change signature, register
variable via lto_symtab_register_decl.
(lto_register_function_decl_in_symtab): Likewise.
(lto_read_tree): Adjust.
* lto-streamer.h (lto_register_deferred_decls_in_symtab): Remove.
(lto_symtab_merge_var): Likewise.
(lto_symtab_merge_fn): Likewise.
(lto_symtab_register_decl): Declare.
(lto_symtab_merge_decls): Likewise.
lto/
* lto.c (lto_read_decls): Do not register deferred decls.
(read_cgraph_and_symbols): Delay symbol and cgraph merging
until after reading the IPA summaries.
* g++.dg/lto/20091002-1_0.C: Adjust flags.
* g++.dg/lto/20091004-1_0.C: New testcase.
* g++.dg/lto/20091004-1_1.C: Likewise.
* g++.dg/lto/20091004-2_0.C: Likewise.
* g++.dg/lto/20091004-2_1.C: Likewise.
* g++.dg/lto/20091004-3_0.C: Likewise.
* g++.dg/lto/20091004-3_1.C: Likewise.
Added:
trunk/gcc/testsuite/g++.dg/lto/20091004-1_0.C
trunk/gcc/testsuite/g++.dg/lto/20091004-1_1.C
trunk/gcc/testsuite/g++.dg/lto/20091004-2_0.C
trunk/gcc/testsuite/g++.dg/lto/20091004-2_1.C
trunk/gcc/testsuite/g++.dg/lto/20091004-3_0.C
trunk/gcc/testsuite/g++.dg/lto/20091004-3_1.C
Modified:
trunk/gcc/ChangeLog
trunk/gcc/lto-cgraph.c
trunk/gcc/lto-streamer-in.c
trunk/gcc/lto-streamer.h
trunk/gcc/lto-symtab.c
trunk/gcc/lto/ChangeLog
trunk/gcc/lto/lto.c
trunk/gcc/testsuite/ChangeLog
trunk/gcc/testsuite/g++.dg/lto/20091002-1_0.C
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug lto/41552] Undefined references with -flto, dependent on object file ordering
2009-10-03 10:55 [Bug lto/41552] New: Undefined references with -flto, dependent on object file ordering rguenth at gcc dot gnu dot org
` (5 preceding siblings ...)
2009-10-05 14:06 ` rguenth at gcc dot gnu dot org
@ 2009-10-05 14:17 ` rguenth at gcc dot gnu dot org
6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-05 14:17 UTC (permalink / raw)
To: gcc-bugs
------- Comment #7 from rguenth at gcc dot gnu dot org 2009-10-05 14:16 -------
Fixed.
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
Target Milestone|--- |4.5.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552
^ permalink raw reply [flat|nested] 8+ messages in thread