This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PR lto/46083 (destructor priorities are wrong)
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, dnovillo at redhat dot com, rguenther at suse dot de
- Date: Sun, 9 Jan 2011 02:01:50 +0100
- Subject: PR lto/46083 (destructor priorities are wrong)
Hi,
the PR is about testsuite/initpri1.c failing with lto.
I am not sure why the testcase is not run with -flto flags. It is declared as
/* { dg-do run { target init_priority } } */ and thus I would expect all
default flags
to be cycled over.
The problem is simple - FINI_PRIORITY is not streamed at all. The reason for
apparent omision seems to be assymetry in between INIT and FINI priorities.
While INIT priorities are defined for VAR_DECLs too, FINI priorities are
defined only for functions.
I wonder whether we ever need VAR_DECL init priorities at all, I would expect
all constructors to be lowered to functions at that time, so perhaps the
streaming can be guarded by the same test as I use for FINI_PRIORITY.
Anyway, that can be subsequent clenaup.
x86_64 bootstrap/regtested in progress. OK if it passes?
PR lto/46083
* lto-streamer-out.c (pack_ts_decl_with_vis_value_fields): Store
DECL_FINI_PRIORITY.
* lto-streamer-in.c )unpack_ts_decl_with_vis_value_fields):
Restore DECL_FINI_PRIORITY.
Index: lto-streamer-out.c
===================================================================
--- lto-streamer-out.c (revision 168596)
+++ lto-streamer-out.c (working copy)
@@ -464,7 +464,11 @@ pack_ts_decl_with_vis_value_fields (stru
}
if (VAR_OR_FUNCTION_DECL_P (expr))
- bp_pack_value (bp, DECL_INIT_PRIORITY (expr), HOST_BITS_PER_SHORT);
+ {
+ bp_pack_value (bp, DECL_INIT_PRIORITY (expr), HOST_BITS_PER_SHORT);
+ if (TREE_CODE (expr) == FUNCTION_DECL && DECL_STATIC_DESTRUCTOR (expr))
+ bp_pack_value (bp, DECL_FINI_PRIORITY (expr), HOST_BITS_PER_SHORT);
+ }
}
Index: lto-streamer-in.c
===================================================================
--- lto-streamer-in.c (revision 168596)
+++ lto-streamer-in.c (working copy)
@@ -1654,6 +1654,11 @@ unpack_ts_decl_with_vis_value_fields (st
priority_type p;
p = (priority_type) bp_unpack_value (bp, HOST_BITS_PER_SHORT);
SET_DECL_INIT_PRIORITY (expr, p);
+ if (TREE_CODE (expr) == FUNCTION_DECL && DECL_STATIC_DESTRUCTOR (expr))
+ {
+ p = (priority_type) bp_unpack_value (bp, HOST_BITS_PER_SHORT);
+ SET_DECL_FINI_PRIORITY (expr, p);
+ }
}
}