[RFC] Remove TLS symbols from section anchor blocks
David Edelsohn
dje.gcc@gmail.com
Sat Dec 8 18:33:00 GMT 2012
[Sorry, I forgot to copy GCC Patches before]
Some of the libgomp testcases fail on AIX when using native TLS
because variables annotated with
#pragma omp threadprivate(thr)
sometimes are placed in section anchor blocks. Variables declared
with "__thread" create decls with the correct TLS model from the
beginning, but OpenMP sometimes creates a decl with TLS_MODEL_NONE and
later tries to make the decl again. make_decl_rtl() is called again
and it calls ENCODE_SECTION_INFO and then change_symbol_block().
However ENCODE_SECTION_INFO explicitly preserves
SYMBOL_FLAG_HAS_BLOCK_INFO and change_symbol_block() place the symbol
in a different block but never re-assesses if the new attributes of
the symbol make it in appropriate for section anchor blocks.
The following patch adds an ENCODE_SECTION_INFO hook for AIX that
removes the SYMBOL_FLAG_HAS_BLOCK_INFO flag if the symbol is
DECL_THREAD_LOCAL_P. This prevents the symbol from being emitted in a
section anchor block and it correctly is emitted in its own section;
it does not remove it from the section anchor blocks data structures.
This fixes some of the libgomp failures.
Is this a reasonable approach? Or should change_symbol_block re-test
use_blocks_for_symbol_p()?
Thanks, David
Index: rs6000.c
===================================================================
--- rs6000.c (revision 194278)
+++ rs6000.c (working copy)
@@ -25886,6 +25886,29 @@
? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
asm_out_file);
}
+
+static void
+rs6000_xcoff_encode_section_info (tree decl, rtx rtl, int first)
+{
+ rtx symbol;
+ int flags;
+
+ default_encode_section_info (decl, rtl, first);
+
+ /* Careful not to prod global register variables. */
+ if (!MEM_P (rtl))
+ return;
+ symbol = XEXP (rtl, 0);
+ if (GET_CODE (symbol) != SYMBOL_REF)
+ return;
+
+ flags = SYMBOL_REF_FLAGS (symbol);
+
+ if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
+ flags &= ~SYMBOL_FLAG_HAS_BLOCK_INFO;
+
+ SYMBOL_REF_FLAGS (symbol) = flags;
+}
#endif /* TARGET_XCOFF */
/* Compute a (partial) cost for rtx X. Return true if the complete
More information about the Gcc-patches
mailing list