https://gcc.gnu.org/bugzilla/show_bug.cgi?id=128437
--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to George Cox from comment #1)
> t.cpp:28:1: internal compiler error: output_operand: '%&' used without any
> local dynamic TLS references
This means that something eliminated "some local dynamic name".
i386.cc:
case '&':
{
const char *name = get_some_local_dynamic_name ();
if (name == NULL)
output_operand_lossage ("'%%&' used without any "
"local dynamic TLS references");
else
assemble_name (file, name);
return;
}
final.cc:
/* Locate some local-dynamic symbol still in use by this function
so that we can print its name in local-dynamic base patterns.
Return null if there are no local-dynamic references. */
const char *
get_some_local_dynamic_name ()
{
subrtx_iterator::array_type array;
rtx_insn *insn;
if (some_local_dynamic_name)
return some_local_dynamic_name;
for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
if (NONDEBUG_INSN_P (insn))
FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
{
const_rtx x = *iter;
if (GET_CODE (x) == SYMBOL_REF)
{
if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
return some_local_dynamic_name = XSTR (x, 0);
if (CONSTANT_POOL_ADDRESS_P (x))
iter.substitute (get_pool_constant (x));
}
}
return 0;
}