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;
}

Reply via email to