Hi,

as mentioned in PR, LTO doesn't propagate node->dynamically_initialized bit for varpool nodes that leads to ASan fails to detect initialization order fiasco even for trivial example (e.g. from here: https://github.com/google/sanitizers/wiki/AddressSanitizerExampleInitOrderFiasco). This trivial patch fixes the issue. Regtested on x86_64-unknown-linux-gnu, OK for mainline?

-Maxim
gcc/ChangeLog:

2017-01-11  Maxim Ostapenko  <m.ostape...@samsung.com>

	PR lto/79042
	* lto-cgraph.c (lto_output_varpool_node): Pack dynamically_initialized
	bit.
	(input_varpool_node): Unpack dynamically_initialized bit.

diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index c0321f7..77605f7 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -626,6 +626,7 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node,
     }
   bp_pack_value (&bp, node->tls_model, 3);
   bp_pack_value (&bp, node->used_by_single_function, 1);
+  bp_pack_value (&bp, node->dynamically_initialized, 1);
   bp_pack_value (&bp, node->need_bounds_init, 1);
   streamer_write_bitpack (&bp);
 
@@ -1400,6 +1401,7 @@ input_varpool_node (struct lto_file_decl_data *file_data,
     node->alias_target = get_alias_symbol (node->decl);
   node->tls_model = (enum tls_model)bp_unpack_value (&bp, 3);
   node->used_by_single_function = (enum tls_model)bp_unpack_value (&bp, 1);
+  node->dynamically_initialized = bp_unpack_value (&bp, 1);
   node->need_bounds_init = bp_unpack_value (&bp, 1);
   group = read_identifier (ib);
   if (group)

Reply via email to