public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug lto/41552]  New: Undefined references with -flto, dependent on object file ordering
@ 2009-10-03 10:55 rguenth at gcc dot gnu dot org
  2009-10-03 11:26 ` [Bug lto/41552] " rguenth at gcc dot gnu dot org
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-10-03 10:55 UTC (permalink / raw)
  To: gcc-bugs

> ./g++ -B. -fPIC -O -flto -c dvector.3.ii slufactor.3.ii
> ./g++ -nostdlib -B. -fPIC -O -shared -o t slufactor.3.o dvector.3.o
> nm t | grep _ZN6soplex7DVectoraSERKNS_6VectorE
> ./g++ -nostdlib -B. -fPIC -O -shared -o t dvector.3.o slufactor.3.o
> nm t | grep _ZN6soplex7DVectoraSERKNS_6VectorE
> ./g++ -nostdlib -B. -fPIC -O -shared -o t dvector.3.o slufactor.3.o -flto
> nm t | grep _ZN6soplex7DVectoraSERKNS_6VectorE
                 U _ZN6soplex7DVectoraSERKNS_6VectorE
> ./g++ -nostdlib -B. -fPIC -O -shared -o t slufactor.3.o dvector.3.o -flto
> nm t | grep _ZN6soplex7DVectoraSERKNS_6VectorE
00000000000004f2 W _ZN6soplex7DVectoraSERKNS_6VectorE

WTF?  1) That function probably is inlined without lto, 2) Obviously the
merged cgraph is dependent on the ordering of object files on the link
command line...

slufactor.3.ii:
---------------
namespace soplex {
    class Vector {
    public:
        Vector& operator=(const Vector& vec);
        int dim() const    { }
    };
    class DVector : public Vector {
    public:
        void reDim(int newdim);
        DVector& operator=(const Vector& vec)    {
            if (vec.dim() != dim())
              reDim(vec.dim());
            Vector::operator=(vec);
        }
    };
    class SLinSolver { };
    class CLUFactor { };
    class SLUFactor : public SLinSolver, private CLUFactor {
        DVector vec;
        void solveRight (Vector& x, const Vector& b);
    };
    void SLUFactor::solveRight (Vector& x, const Vector& b) {
        vec = b;
        vec = b;
    }
}
----------

dvector.3.ii:
------------
namespace soplex {
    typedef double Real;
    class Vector {
        int dimen;
        Real* val;
    public:
        Vector(int p_dimen, Real *p_val)
            : dimen(p_dimen)       , val(p_val)    { }
        int dim() const    {
            return dimen;
        }
    };
    class DVector : public Vector {
        Real* mem;
        void reDim(int newdim);
        explicit DVector(const Vector& old);
        DVector& operator=(const Vector& vec)    {
            if (vec.dim() != dim())
              reDim(vec.dim());
        }
    };
    DVector::DVector(const Vector& old)
        : Vector(0, 0)    , mem( 0 )
      {
        *this = old;
      }
}
----------


-- 
           Summary: Undefined references with -flto, dependent on object
                    file ordering
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: lto
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org


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 ` 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

end of thread, other threads:[~2009-10-05 14:17 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).